我在Chrome中运行了这段代码:
var b = 0;
console.log("b=" + b);
console.log("b bin " + b.toString(2));
var pm = 8 ;
console.log("pm=" + pm);
console.log("pm bin " + pm.toString(2));
b = b ^ pm;
console.log("b=" + b);
console.log("b bin " + b.toString(2));
console.log("_______________________________");
b = 0;
console.log("b=" + b);
console.log("b bin " + b.toString(2));
pm = 16;
console.log("pm=" + pm);
console.log("pm bin " + pm.toString(2));
b = b ^ pm;
console.log("b=" + b);
console.log("b bin " + b.toString(2));
console.log("_______________________________");
b = 0;
console.log("b=" + b);
console.log("b bin " + b.toString(2));
pm = 2147483648;
console.log("pm=" + pm);
console.log("pm bin " + pm.toString(2));
b = b ^ pm;
console.log("b=" + b);
console.log("b bin " + b.toString(2));
console.log("_______________________________");
控制台输出是:
b=0
b bin 0
pm=8
pm bin 1000
b=8
b bin 1000
______________________
b=0
b bin 0
pm=16
pm bin 10000
b=16
b bin 10000
_______________________________
b=0
b bin 0
pm=2147483648
pm bin 10000000000000000000000000000000
b=-2147483648
b bin -10000000000000000000000000000000
_______________________________
为什么不是b ^ 2147483648返回2147483648(而是它的-2147483648)类似于b ^ 8和b ^ 16会发生什么?
tl;博士:
我问,因为我正在尝试存储一个4x8板的元素位置,我使用位掩码在某个位置设置一个元素,但是对于我的元素(0,0)和相应的位掩码1然后是31 0s(十进制2147483648)将所述掩码应用于持有该位置的数字使得该数字变为负数。
答案 0 :(得分:4)
为什么
b ^ 2147483648
不会2147483648
(而是-2147483648
)类似于b ^ 8
和b ^ 16
...?
因为JavaScript的binary bitwise operators(几乎全部)是根据signed 32-bit integer values定义的。 (例外是>>>
。)JavaScript的数字本质上是IEEE-754双精度浮点数,但是按位运算符将它们转换为带符号的32位整数,然后再将其转换为应用运算符。由于2147483648超出了有符号的32位范围,因此它会包装。