在python2.7中,以下代码返回正确的结果(-18027917)
from __future__ import print_function
def twos_comp(val, bits):
if (val & (1 << (bits - 1))) != 0:
val -= 1 << bits
return val
valBinary = "110111011001110101001110011"
print(twos_comp(int(valBinary, 2), len(valBinary)))在JavaScript (Node.js)中,以下代码返回不正确的结果(1995238003)
function toTwosComplement(val, bits) {
if ((val & (1 << (bits - 1))) != 0) {
val -= (val - 1) << bits;
}
return val;
}
valBinary = "110111011001110101001110011"; // same as python example
console.log(toTwosComplement(parseInt(valBinary, 2), valBinary.length));显然,位运算符(或int / parseInt)的行为有一些不同,但我还没有看到它是什么。
发布于 2014-08-05 16:48:44
第一,
val -= (val - 1) << bits;和
val -= 1 << bits是不对等的。
由于二进制字符串有27位长,这很可能是问题的根源。
更广泛地说,这两种语言对数字一词的定义非常不同。
Python有任意精度整数。
长整数具有无限的精度。
相比之下,JavaScript有IEEE 64b化作整数的双倍和按位运算符将它们的操作数截断为32位。
数字是64位浮点数,类似于Java的双重和双倍.没有整数类型。两个整数之间的除法可能会产生分数的结果。
这意味着您最多可以存储在52位精度中,如果最高阶位大于2**52,那么低阶位将被截断。
由于JavaScript的浮点特性,大二进制数中最不重要的位可能被舍入,而最重要的位可能被(<<)抛出。
发布于 2014-08-05 16:47:51
为什么这些线不匹配?
Python:
val -= 1 << bits联署材料:
val -= (val - 1) << bits;https://stackoverflow.com/questions/25144143
复制相似问题