我正在使用 JavaScript 开发 CRC32 寄存器,这是我的新手。 一切顺利,直到最后一步:将校验和与 0xFFFFFFFF 异或。
1001010100111101101100010001000
^ 11111111111111111111111111111111 = -1001010100111101101100010001001
1251924104 ^ 4294967295 = -1251924105
我预计问题是负面的。我能做些什么来解决它?
Javascript 中的按位运算会将数字强制转换为带符号的 32 位整数,最大值为
2^31-1
。你的电话号码0xFFFFFFFF
是2^32-1
.
但是,如果您改用 BigInts,它会工作得很好:
console.log(0xFFFFFFFF ^ 0)
console.log(String(0xFFFFFFFFn ^ 0n))
注意:我不得不使用
String()
,因为 stackoverflow console.log 函数似乎无法处理 BigInts。
JavaScript 中的大多数按位运算符都以带符号的 32 位整数形式进行运算并返回其结果(只要操作数是纯数字,而不是双整数)。然而,有一个运算符没有:无符号右移运算符
>>>
,它返回一个 unsigned 32 位整数。
您可以使用零的无符号右移将带符号的 32 位整数强制转换为无符号的 32 位整数:
console.log(~0);
console.log(~0 >>> 0);