按位运算符改变算术结果

时间:2011-03-17 13:18:05

标签: javascript math bit-manipulation

有人可以向我解释为什么以下代码:

  var a = 0xFFFFFFFF;
  a &= 0xFFFFFFFF;
  a += 1;
  alert( "a = " + a );

  var b = 0xFFFFFFFF;
  b += 1;
  alert( "b = " + b );

为a和b返回不同的值?

自0xFFFFFFFF& 0xFFFFFFFF应该等于0xFFFFFFFF,两段代码都应该返回0x100000000。相反,获取值0和b获取值0x100000000。

4 个答案:

答案 0 :(得分:3)

JS按位运算符返回签名的 32位整数。 0xFFFFFFFF转换为-1,加1表示0。

答案 1 :(得分:2)

由于JavaScript使用带符号整数,因此4294967295不能用32位表示,因此它会转换为更宽的类型。

var a = 0xFFFFFFFF;
alert("a = " + a);  // gives 4294967295 (too large for a signed 32-bit integer)

a &= 0xFFFFFFFF;    // gives result as 32 bit signed integer
alert("a = " + a);  // gives -1

有关按位运算符的详细信息,请访问:Mozilla Developer Network: Bitwise Operators

如果您将a初始化为0xFFFFFFF(即7 F s),您将获得预期的结果。

var a = 0xFFFFFFF;
alert("a = " + a);   // gives 268435455
a &= 0xFFFFFFFF;
alert("a = " + a);   // gives 268435455

答案 2 :(得分:0)

试试这个:

var a = 0xFFFFFFFF;
alert( "a = " + a );
a &= 0xFFFFFFFF;
alert( "a = " + a );
a += 1;
alert( "a = " + a );

并且应该更明显地发生了什么。 &=导致b不会发生类型转换。

答案 3 :(得分:0)

在JavaScript中,以下表达式为true

(0xFFFFFFFF & 0xFFFFFFFF) == -1

如dan04所述,布尔运算的结果是一个有符号的32位整数值,与参数的类型无关。 当您查看0xFFFFFFFF和-1的位模式时,使用32位值时它们是相同的。

要始终获得积极的结果,可以在结果为负时将2 ^ 32加到结果中。

function and(a, b) { let y = a & b; return (y < 0) ? (y + 0x100000000) : y;}

那么下面的表达式是true

and(0xffffffff, 0xffffffff) == 0xffffffff