当我在JavaScript上运行0x00000000C17E000F & 0x00000000C17E0000
时,它返回-1048707072
而不是3246260224
。
每个的二进制是
0x00000000C17E000F
:(省略了32个零)1100 0001 0111 1110 0000 0000 0000 1111 0x00000000C17E0000
:(省略了32个零点)1100 0001 0111 1110 0000 0000 0000 0000 所以我期望0x00000000C17E000F & 0x00000000C17E0000
的结果为3246260224
,但结果为-1048707072
。
3246260224
:(省略了 0 中的32)1100 0001 0111 1110 0000 0000 0000 0000 -1048707072
:(省略了 1 中的32)1100 0001 0111 1110 0000 0000 0000 0000 为什么Javascript在那里(在33到64位之间)将0 & 0
计算为1
?
(我听说Javascript Number由64位组成。)
答案 0 :(得分:6)
来自the MDN on bitwise operators:
操作数被转换为32位整数,并由一系列位(零和一)表示。超过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