如何让JavaScript位运算符生成无符号结果?CRC32算法遇负数问题
解决JavaScript中CRC32异或后出现负数的问题
JavaScript里的数字是有符号64位双精度浮点数,当你把32位校验和和0xFFFFFFFF(十进制4294967295)异或后,结果的最高位会被当成符号位,直接导致数值变成负数。
解决这个问题很简单,用下面两种方法都能把结果转成正确的无符号32位整数:
- 方法一:用无符号右移操作
>>> 0强制转换
const checksum = 1251924104; const unsignedCrc = (checksum ^ 0xFFFFFFFF) >>> 0; console.log(unsignedCrc); // 输出 3043043191
>>> 0会把数值强制转为32位无符号整数,自动忽略符号位的影响。
- 方法二:和
0xFFFFFFFF做按位与操作
const checksum = 1251924104; const unsignedCrc = (checksum ^ 0xFFFFFFFF) & 0xFFFFFFFF; console.log(unsignedCrc); // 输出 3043043191
按位与操作会保留数值的低32位,清零高位,从而得到符合CRC32要求的无符号校验和。
内容的提问来源于stack exchange,提问作者Shadow_Guo
相关产品推荐
相关产品推荐

