Javascript xor ^ with 0返回错误结果

时间:2014-11-18 22:36:32

标签: javascript bit-manipulation xor

我正在使用带有2个变量的二进制xor运算符^:

var v1 = 0;
var v2 = 3834034524;
var result = v1 ^ v2;

结果是-460932772。 你知道为什么吗?

谢谢

3 个答案:

答案 0 :(得分:2)

3834034524,因为32位无符号整数是十六进制E486B95C或二进制11100100100001101011100101011100。请注意,最重要(最左侧)位已设置。这是32位签名整数的符号位。

在那里,该位模式转换为十进制-460932772。 XOR操作将结果强制为有符号整数。

附加信息:32位签名整数可以处理从-2147483648到+2147483647的值(超出原始值,因此包裹)。 32位无符号整数处理0到+4294967295之间的值。 JavaScript是一种动态类型语言,值可能会根据需要更改类型。数字可能变为浮点值,或按位运算可能会将其变为整数,或者它可能变为字符串。在最近的JavaScript版本中,有一些方法可以使用特定的数据类型,但这不是您在简单计算中所做的事情。

答案 1 :(得分:1)

这是预期的行为,这些是签名号码。

只需将结果截断为无符号整数

var result = (v1 ^ v2) >>> 0;

答案 2 :(得分:1)

ToInt32 operation不保留符号 - 它会将您的号码转换为带符号的32位表示。由于3834034524大于2 31 ,它将溢出并产生负整数。

  010           --ToInt32-->  000000000000000000000000000000002
^ 383403452410  --ToInt32-->  111001001000011010111001010111002
                                         V xor V
= -46093277210  <-fromInt32-  111001001000011010111001010111002