JavaScript中的位操作

JavaScript中的位操作,javascript,bitwise-operators,Javascript,Bitwise Operators,我知道JavaScript中的数字是以IEEE-754格式存储的。但当我们使用整数,特别是位运算符时,它们被表示为2的32位补码 所以-1应该是0xFFFFFFFF。但是(-1)。toString(2)是-1。而且-1>>31是1,没错,但是-1>>32必须是0,但是它是4294967295。而-1>0是-1,但是-1>>0是4294967295?我知道>和>之间有什么区别,但是第二个操作数是0,所以我不明白为什么这些操作以不同的方式工作。 在算术移位中,符号位被扩展以保持 数字的符号性 8位中

我知道JavaScript中的数字是以IEEE-754格式存储的。但当我们使用整数,特别是位运算符时,它们被表示为2的32位补码

所以
-1
应该是
0xFFFFFFFF
。但是
(-1)。toString(2)
-1
。而且
-1>>31
是1,没错,但是
-1>>32
必须是
0
,但是它是
4294967295
。而
-1>0
-1
,但是
-1>>0
4294967295
?我知道
>
>
之间有什么区别,但是第二个操作数是
0
,所以我不明白为什么这些操作以不同的方式工作。

在算术移位中,符号位被扩展以保持 数字的符号性

8位中的
-1
11111111
-2
11111110

这是这样处理的,因为如果您计数到可能的最高数字+1,将显示可能的最低数字(
8位:01111111+1=10000000
),这就是为什么
111111111
-1

然而,逻辑右移并不关心该值是否可以 可能代表一个有符号的数字;它只是把所有的东西都移动到 右键,从左到右填充0

所以在这里,
-1>>
11111111
一推到右边,这样“-”号就丢失了,最高正数
01111111
(在
8位
中)就会显示出来


-1>>0等于-1的另一个原因是,11111111>>0实际上不添加任何内容,而-1>>>0仍然移动所有内容并用0填充左侧位,每增加一步“0”将使值减半,直到0为止。你可以试试-1>>>31看看它得到了1

有一个MDN在JavaScript环境中有很好的关于位运算符的文档:@DanielLowman我已经读过了。但我还是不明白为什么-1>>>32不是0?我们移动它32次,加上32个零,所以它应该是0是的,我知道。但是-1是0xFFFFFF(或32
1
),所以-1>>>32应该是0,不是吗?是的,当你>>>使用了大量的位时,它只是重新启动这个过程,就像它再次是>>>0一样,33次减半,依此类推,我意识到。因此,当我们进行任何N位移位且N>=32时,它将等于(N%32)位移位?是的,确切地说:)我不确定JavaScript,但在C中,移位超过CPU寄存器大小是未定义的行为。由于C位移位指令转换为CPU汇编指令,因此它依赖于硬件。例如,英特尔x86
shr
/
shl
指令在32位CPU上仅使用5个最低有效位参数,或在64位CPU上使用6个LSB。这就是为什么会出现
%32
行为(
2^5=32
)。但是,这并不意味着其他CPU(arm、ppc、MIB等)也会这样做(可能会,但不能保证)。