我正在使用带有2个变量的二进制xor运算符^:
var v1 = 0;
var v2 = 3834034524;
var result = v1 ^ v2;
结果是-460932772。 你知道为什么吗?
谢谢
答案 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