Javascript 32位无符号整数上的逐位运算?

Javascript 32位无符号整数上的逐位运算?,javascript,bit-manipulation,Javascript,Bit Manipulation,JavaScript在执行逐位操作之前将操作数转换为32位有符号整数。它还对32位有符号整数执行操作,这意味着结果是32位有符号整数 因为我想对32位无符号整数执行逐位操作,所以我想知道是否有一种方法可以使用JavaScript的损坏结果来找到预期的结果 为了证明我的想法,例如,在C中,它是关于我想要什么的参考 unsigned int a = 3774191835u; unsigned int b = a >> 2; /* b == 943547958 */ 在JavaScrip

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 */
 var a = 1986735448;
 var b = a << 1;
 /* b == -321496400 */
让我们用不同的操作来尝试这个。在C中

unsigned int a = 1986735448u;
unsigned int b = a << 1;
/* b == 3973470896 */
无符号整数a=1986735448u;

unsigned int b=aJavaScript通过提供两个位移位运算符,
>
>>
来解决这个问题。您希望在不移动符号位的情况下执行移位。

这很难看,但是:

var a = 1986735448;
var b = (a << 1) >>> 0;
/* b = 3973470896 */
var a=1986735448;
VarB=(a>>0;
/*b=3973470896*/

您只需遵循以下规则:

  • 始终以
    >>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
    
    C:(3774191835>>2)1247483648
    js:(3774191835>>>2 | 2147483648)>>>0
    C:1986735448>0
    C:3774191835和4294967295
    js:(3774191835&4294967295)>>>0
    

    只有当最后一个运算是
    >>
    ,才不需要
    >>>0

    不需要。JavaScript仍然将操作数转换为32位有符号整数,并将运算结果返回为32位有符号整数。请查看我更新的答案,这表明这与具体的位移位无关。当我发出
    警报时(3774191835>>2)
    ,它给了我943547958,所以我猜赋值中发生了什么事?这种特殊情况可能恰好用无符号右移来修复,但其他所有运算符呢?似乎@PaulPRO对^ ^ ^+,-,*有一个答案,不关心符号性,结果(二进制位模式)是相同的。对于除法,可以使用(a>>0)/b@DelanAzabani,这只是因为>>>返回了一个无符号的值。移位是否有符号都是一样的,只是Javascript引擎对位的解释发生了变化。因此,在多次按位操作(如((a | 2)>>0I理解这一点;但是,
    (3774191835>>2)>>>0
    以JavaScript返回
    4164773430
    ,这是错误的。我真的不知道该在这里做什么。+1这里也很好地描述了这一点:哦,JavaScript,你为什么一定这么奇怪?
    C:  (3774191835 >> 2) | 2147483648
    js: (3774191835 >>> 2 | 2147483648) >>> 0
    
    C:  1986735448 << 1
    js: (1986735448 << 1) >>> 0
    
    C:  3774191835 & 4294967295
    js: (3774191835 & 4294967295) >>> 0