32位无符号整数的按位运算?

时间:2011-07-23 03:51:06

标签: javascript bit-manipulation

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 */

3 个答案:

答案 0 :(得分:80)

您只需遵循以下规则:

  1. 始终以>>> 0结束位操作,因此结果将被解释为无符号。
  2. 请勿使用>>。如果最左边的位为1,它将尝试预先设置符号,从而将1引入左侧。始终使用>>>
  3. 示例:

    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通过提供两位移位运算符>>>>>来解决此问题。您希望>>>在不移动符号位的情况下进行移位。