JavaScript中如何正确实现64位整数的按位异或(XOR)运算
JavaScript实现64位整数按位异或(XOR)运算
JavaScript执行位运算时,默认会将所有双精度浮点数转换为有符号32位整数,无法直接对64位整数做位操作。你参考已有的64位按位与函数改写的异或函数运行异常,是两处逻辑写错了:
- 提取数值低32位段的逻辑错误:原按位与函数中,是通过
v & 0x7fffffff取出数值的低31位,和拆分出的高32位段对应拼接。你写的异或函数里,把这里的按位与&写成了按位异或^,相当于直接拿原数和掩码做异或,根本没有正确取出低位段的值。 - 最终结果拼接逻辑错误:原按位与函数是把计算完的高32位段结果乘以
0x80000000,加上计算完的低32位段结果得到最终值,你写成了高段值减去低段值,拼接逻辑完全错误。
修正后的可正常运行的64位异或函数代码如下:
function xor(v1, v2) { var hi = 0x80000000; var low = 0x7fffffff; var hi1 = ~~(v1 / hi); var hi2 = ~~(v2 / hi); var low1 = v1 & low; var low2 = v2 & low; var h = hi1 ^ hi2; var l = low1 ^ low2; return h * hi + l; }
补充说明:这个实现仅支持在双精度浮点数可精确表示的整数范围内(即绝对值小于2^53)的64位整数运算,如果需要处理超出这个范围的64位整数,建议使用原生
BigInt类型做位运算,写法更简单也不会有精度问题,直接写BigInt(v1) ^ BigInt(v2)即可得到正确结果。
内容的提问来源于stack exchange,提问作者José A Pérez
相关产品推荐
相关产品推荐

