JavaScript中的位操作
我知道JavaScript中的数字是以IEEE-754格式存储的。但当我们使用整数,特别是位运算符时,它们被表示为2的32位补码 所以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位中
-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(或321
),所以-1>>>32应该是0,不是吗?是的,当你>>>使用了大量的位时,它只是重新启动这个过程,就像它再次是>>>0一样,33次减半,依此类推,我意识到。因此,当我们进行任何N位移位且N>=32时,它将等于(N%32)位移位?是的,确切地说:)我不确定JavaScript,但在C中,移位超过CPU寄存器大小是未定义的行为。由于C位移位指令转换为CPU汇编指令,因此它依赖于硬件。例如,英特尔x86shr
/shl
指令在32位CPU上仅使用5个最低有效位参数,或在64位CPU上使用6个LSB。这就是为什么会出现%32
行为(2^5=32
)。但是,这并不意味着其他CPU(arm、ppc、MIB等)也会这样做(可能会,但不能保证)。