Del*_*ani 42 javascript bit-manipulation
在执行按位运算之前,JavaScript会将操作数转换为32位有符号整数.它还使用32位有符号整数执行操作,这意味着结果是32位有符号整数.
因为我想用32位无符号整数进行按位运算,我想知道是否有办法使用JavaScript的错误结果来找出预期的结果.
为了证明我的想法,例如,在C中,这是我想要的参考,
unsigned int a = 3774191835u;
unsigned int b = a >> 2;
/* b == 943547958 */
Run Code Online (Sandbox Code Playgroud)
在JavaScript中,
var a = 3774191835;
var b = a >> 2;
/* b == -130193866 */
Run Code Online (Sandbox Code Playgroud)
让我们尝试不同的操作.在C中,
unsigned int a = 1986735448u;
unsigned int b = a << 1;
/* b == 3973470896 */
Run Code Online (Sandbox Code Playgroud)
在JavaScript中,
var a = 1986735448;
var b = a << 1;
/* b == -321496400 */
Run Code Online (Sandbox Code Playgroud)
既然JavaScript已经使用操作数作为带符号的int来评估我的按位运算,那么我们当然会得到与C中的结果不同的结果,我们可以在无符号整数上正确执行按位运算.
我知道这是可能的,但我不确定一种方法,基本上,我可以将JavaScript的结果转换为预期的结果.
零填充右移将结果归零仅适用于第二种情况,但不适用于第一种情况.
var a = 3774191835;
var b = (a >> 2) >>> 0;
/* b == 4164773430 */
var a = 1986735448;
var b = (a << 1) >>> 0;
/* b == 3973470896 */
Run Code Online (Sandbox Code Playgroud)
小智 87
您只需遵循以下规则:
>>> 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
Run Code Online (Sandbox Code Playgroud)
只有当最后op是>>>,>>> 0是没有必要的.
| 归档时间: |
|
| 查看次数: |
13757 次 |
| 最近记录: |