Roy*_*yHB 0 javascript python node.js
在python 2.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)))
Run Code Online (Sandbox Code Playgroud)
在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));
Run Code Online (Sandbox Code Playgroud)
显然,位运算符(或int/parseInt)的行为有所不同,但我无法看到它是什么.
第一,
val -= (val - 1) << bits;
Run Code Online (Sandbox Code Playgroud)
和
val -= 1 << bits
Run Code Online (Sandbox Code Playgroud)
不等同.
由于您的二进制字符串长度为27位,因此很可能是您的问题的根源.
更一般地说,这两种语言对术语编号的定义非常不同.
Python有任意精度整数.
长整数具有无限精度.
相比之下,JavaScript有IEEE 64b双精度假装是整数和按位运算符,它们将操作数截断为32位.
Number是64位浮点,类似于Java的double和Double.没有整数类型.两个整数之间的划分可能产生分数结果.
这意味着您可以存储最多52位的精度,如果最高位大于2**52,则会截断低位.
由于JavaScript的浮点特性,大二进制数的最低有效位可能会四舍五入,而最高有效位可能被(<<)抛出.
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |