Javascript bitwsie操作0 ^ 2147483648产生-2147483648

时间:2014-09-13 22:43:25

标签: javascript bitwise-operators

我在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)将所述掩码应用于持有该位置的数字使得该数字变为负数。

1 个答案:

答案 0 :(得分:4)

  

为什么b ^ 2147483648不会2147483648(而是-2147483648)类似于b ^ 8b ^ 16 ...?

因为JavaScript的binary bitwise operators(几乎全部)是根据signed 32-bit integer values定义的。 (例外是>>>。)JavaScript的数字本质上是IEEE-754双精度浮点数,但是按位运算符将它们转换为带符号的32位整数,然后再将其转换为应用运算符。由于2147483648超出了有符号的32位范围,因此它会包装。

相关问题