如何强制按位运算符生成未签名的结果?

问题描述 投票:0回答:2

我正在使用 JavaScript 开发 CRC32 寄存器,这是我的新手。 一切顺利,直到最后一步:将校验和与 0xFFFFFFFF 异或。

1001010100111101101100010001000
 ^ 11111111111111111111111111111111 = -1001010100111101101100010001001

1251924104 ^ 4294967295 = -1251924105

我预计问题是负面的。我能做些什么来解决它?

javascript bit-manipulation bitwise-operators
2个回答
1
投票

Javascript 中的按位运算会将数字强制转换为带符号的 32 位整数,最大值为

2^31-1
。你的电话号码
0xFFFFFFFF
2^32-1
.

但是,如果您改用 BigInts,它会工作得很好:

console.log(0xFFFFFFFF ^ 0)

console.log(String(0xFFFFFFFFn ^ 0n))

注意:我不得不使用

String()
,因为 stackoverflow console.log 函数似乎无法处理 BigInts。


0
投票

JavaScript 中的大多数按位运算符都以带符号的 32 位整数形式进行运算并返回其结果(只要操作数是纯数字,而不是双整数)。然而,有一个运算符没有:无符号右移运算符

>>>
,它返回一个 unsigned 32 位整数。

您可以使用零的无符号右移将带符号的 32 位整数强制转换为无符号的 32 位整数:

console.log(~0);
console.log(~0 >>> 0);

© www.soinside.com 2019 - 2024. All rights reserved.