【问题标题】:Javascript twos complementJavascript 二进制补码
【发布时间】:2014-09-20 11:12:17
【问题描述】:

以下 python 代码似乎可以很好地处理数字的二进制补码:

def twos_comp(self, val, bits):
    if (val & (1 << (bits - 1))) != 0:
        val -= 1 << bits
    return val

它被用作num = self.twos_comp(int(binStr, 2), len(binStr)) 其中 binStr 是一个包含任意长度二进制数的字符串。

我需要在 javascript(对于 node.js)中做同样的事情。我整天都在与它作斗争,并且即将从人类中辞职。显然二进制/按位数学不是我的强项。

有人可以帮忙,这样我就可以继续更有效地浪费时间:-)

【问题讨论】:

  • 什么代码让你最接近解决方案,你能把它包括在这里吗(这样我们就不必从头开始写了)? :)

标签: javascript python math binary


【解决方案1】:
function toTwosComplement(integer, numberBytes, dontCheckRange) {   
    // @integer - > the integer to convert
    // @numberBytes -> the number of bytes representing the number (defaults to 1 if not specified)

    var numberBits = (numberBytes || 1) * 8;

    // make sure its in range given the number of bits
    if (!dontCheckRange && (integer < (-(1 << (numberBits - 1))) || integer > ((1 << (numberBits - 1)) - 1))) 
        throw "Integer out of range given " + numberBytes + " byte(s) to represent.";

    // if positive, return the positive value
    if (integer >= 0)
        return integer;

    // if negative, convert to twos complement representation
    return ~(((-integer) - 1) | ~((1 << numberBits) - 1));
}

【讨论】:

  • 谢谢乔治,我会试一试并报告
  • George - numberBytes 的目的是设置最大期望值的可能位数吗?
  • 通过指定 numberBytes 你可以用你想要的字节数来表示数字。例如如果你通过 4,你的数字将用 32 位表示。
猜你喜欢
  • 2012-11-23
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2015-04-07
相关资源
最近更新 更多