Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 改变算术结果的位运算符_Javascript_Math_Bit Manipulation - Fatal编程技术网

Javascript 改变算术结果的位运算符

Javascript 改变算术结果的位运算符,javascript,math,bit-manipulation,Javascript,Math,Bit Manipulation,有人能给我解释一下为什么会出现以下代码: var a = 0xFFFFFFFF; a &= 0xFFFFFFFF; a += 1; alert( "a = " + a ); var b = 0xFFFFFFFF; b += 1; alert( "b = " + b ); 为a和b返回不同的值 由于0xFFFFFF&0xFFFFFF应等于0xFFFFFFFF,因此两段代码都应返回0x100000000。相反,a的值为0,b的值为0x100000000。请尝试

有人能给我解释一下为什么会出现以下代码:

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

  var b = 0xFFFFFFFF;
  b += 1;
  alert( "b = " + b );
为a和b返回不同的值

由于0xFFFFFF&0xFFFFFF应等于0xFFFFFFFF,因此两段代码都应返回0x100000000。相反,a的值为0,b的值为0x100000000。

请尝试以下操作:

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

现在发生的事情应该更明显一点。&=导致的类型转换不会发生在b上。

JS按位运算符返回带符号的32位整数。0xFFFFFF转换为-1,加1得到0。

由于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
有关按位运算符的详细信息,请参见:

如果将a初始化为0xFFFFFFF,即7 Fs,则会得到预期的结果

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

在JavaScript中,以下表达式为真:

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

要始终获得阳性结果,当结果为阴性时,可以向结果中添加2^32:

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

关于您的最后一个问题-只需在b+=1之前添加b&=0xFFFFFFFF!顺便说一句,a和b的结果是什么?我不应该这样做,因为0xFFFFFF&0xFFFFFFFF=0xFFFFFFFF。它们两次的值应该完全相同。a的值为0,b的值为0x100000000。0xFFFFFF对于32位整数来说不是太大。这是一个32位整数所能容纳的最大值。它仍然没有意义。0xFFFFFF是一个32位整数,显示为4294967295。然后使用另一个32位整数作为第二个操作数执行逐位运算符。两者都被转换成一个位数组来执行and运算。结果显示为带符号整数-1。除了数字的显示方式外,没有任何变化?为什么要在执行逐位操作之前将位数组转换为有符号整数?你回答了我的问题,但还有几个问题要问。0xFFFFFF不是32位有符号整数,而是可以处理如此大的数字的更广泛类型。然而,按位and的结果是一个32位有符号整数。这很有意义。我想我不应该假设所有JavaScript变量都是64位的。JavaScript实际上没有整数。它只包含数字,这些数字被实现为双精度,因此限制为53位精度,其他11位用于指数。在查询一个使用64位整数作为唯一标识符的数据库时,我被这个事实所困扰。
function and(a, b) { let y = a & b; return (y < 0) ? (y + 0x100000000) : y;}
and(0xffffffff, 0xffffffff) == 0xffffffff