JavaScript中5与不同长度0x5前缀十六进制数按位与结果异常求解
JavaScript 64位数值位运算结果异常原因
核心原因
- JavaScript 中针对
Number类型的所有按位操作符,都会先将两个操作数强制转换为32位有符号补码整数,超过32位的高位部分会被直接截断丢弃,不会参与运算。 - 常规
Number类型为IEEE 754双精度64位浮点数,仅能精确表示范围在-2^53 ~ 2^53之间的整数,超出该范围的整数值本身就会存在精度丢失问题。
对应当前问题的验证说明
你给出的三个十六进制常量:
0x5555555555555为13位十六进制,对应二进制长度为52位,低于2^53的精度阈值,且低32位的最后三位为101,和数值5(二进制101)按位与得到结果5,符合预期。0x55555555555555为14位十六进制,数值超过32位有符号整数的最大值2^31-1,按位运算时高位被截断,剩余低32位的最后三位为100,和5按位与得到结果4。0x555555555555555为15位十六进制,截断后低32位的最后三位为000,和5按位与得到结果0。
64位位运算解决方案
如果需要对64位甚至更长的整数执行位运算,使用ES2020标准新增的BigInt类型即可,在数值末尾加n标识为BigInt类型,即可保留完整的位数参与运算:
console.log(5n & 0x5555555555555n); console.log(5n & 0x55555555555555n); console.log(5n & 0x555555555555555n);
以上代码三次输出均为5n,符合预期。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

