当我在javascript上运行0x00000000C17E000F & 0x00000000C17E0000
时,它返回-1048707072
而不是3246260224
。
每个is的二进制
0x00000000C17E000F
:(省略32个零) 1100 0001 0111 1110 0000 0000 0000 11110x00000000C17E0000
:(省略32个零) 1100 0001 0111 1110 0000 0000 00003246260224
:(32 of 省略) 1100 0001 0111 1110 0000 0000 0000 0000-1048707072
:(32 of 1省略) 1100 0001 0111 1110 0000 0000 0000为什么Javascript在那里计算0 & 0
为1
( 33到64位)?
(我听说Javascript数字是64位的。)
发布于 2018-08-14 04:13:30
来自the MDN on bitwise operators
将操作数转换为32位整数,并由一系列位(0和1)表示。超过32位的数字会丢弃其最高有效位。
您的数字不在-2^31和2^31之间,因此它们会因转换而更改。
注意,这并不是真正的溢出,也不是存储的限制: Javascript中的数字是64位(IEEE754双精度),这意味着它们可以存储-2^53到2^53之间的所有整数。根据设计,32位的限制仅限于按位运算符。
这句话的结果是,您可以很好地设计自己的函数来对更大的整数执行逐位运算:
function and(a, b){
let abits = Array.from(a.toString(2));
let bbits = Array.from(b.toString(2));
return parseInt(abits.map((abit, i)=>abit & bbits[i]).join(""), 2);
}
console.log(and(0x00000000C17E000F, 0x00000000C17E0000)); // 3246260224
https://stackoverflow.com/questions/51829844
复制相似问题