JavaScript在执行按位操作之前将操作数转换为32位有符号整数。它还使用32位有符号整数执行操作,这意味着结果是32位有符号整数。
因为我想用32位无符号整数执行按位运算,我想知道是否有办法使用JavaScript的错误结果来找出预期的结果。
为了证明我的想法,例如,在C中,这是我想要的参考,
unsigned int a = 3774191835u;
unsigned int b = a >> 2;
/* b == 943547958 */
在JavaScript中,
var a = 3774191835;
var b = a >> 2;
/* b == -130193866 */
让我们尝试不同的操作。在C中,
unsigned int a = 1986735448u;
unsigned int b = a << 1;
/* b == 3973470896 */
在JavaScript中,
var a = 1986735448;
var b = a << 1;
/* b == -321496400 */
既然JavaScript已经使用操作数作为带符号的int来评估我的按位运算,我们当然会得到与C中不同的结果,我们可以在无符号整数上正确执行按位运算。
我知道这是可能的,但我不确定我可以将JavaScript的结果转化为预期的结果。
零填充右移将结果归零仅适用于第二种情况,但不适用于第一种情况。
var a = 3774191835;
var b = (a >> 2) >>> 0;
/* b == 4164773430 */
var a = 1986735448;
var b = (a << 1) >>> 0;
/* b == 3973470896 */
答案 0 :(得分:80)
您只需遵循以下规则:
>>> 0
结束位操作,因此结果将被解释为无符号。>>
。如果最左边的位为1,它将尝试预先设置符号,从而将1
引入左侧。始终使用>>>
。示例:
C: (3774191835 >> 2) | 2147483648
js: (3774191835 >>> 2 | 2147483648) >>> 0
C: 1986735448 << 1
js: (1986735448 << 1) >>> 0
C: 3774191835 & 4294967295
js: (3774191835 & 4294967295) >>> 0
仅当最后一项操作为>>>
时,才需要>>> 0
。
答案 1 :(得分:2)
这很难看,但是:
var a = 1986735448;
var b = (a << 1) >>> 0;
/* b = 3973470896 */
答案 2 :(得分:1)
JavaScript通过提供两位移位运算符>>
和>>>
来解决此问题。您希望>>>
在不移动符号位的情况下进行移位。