Javascript 32位无符号整数上的逐位运算?
JavaScript在执行逐位操作之前将操作数转换为32位有符号整数。它还对32位有符号整数执行操作,这意味着结果是32位有符号整数 因为我想对32位无符号整数执行逐位操作,所以我想知道是否有一种方法可以使用JavaScript的损坏结果来找到预期的结果 为了证明我的想法,例如,在C中,它是关于我想要什么的参考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
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