我知道外面也有类似的问题。但我好奇的是,为什么逻辑左移和算术左移是一样的。
我知道算术左移和逻辑左移在技术上是相同的,因为msb (最高有效位)在这两个操作中都不会被保留,msb被替换为0,所有的位都被简单地“左移”。但是,为什么我们不能保留msb,同时将剩下的位移位给左算术移位呢?算术右移保留了msb来表示带符号的位,那么为什么我们不对算术左移做同样的事情呢?
例如,在Java语言中:">>>“是逻辑右移,">>”是算术右移,但是"<<“执行算术/逻辑左移,即使带符号的位没有保留。
发布于 2021-07-15 04:40:49
但是,为什么我们不能保留最大有效位,同时把剩下的位移位给左算术移位呢?
我们可以做到这一点,例如,这是该想法的java实现:
int shiftLeftPreserveMSB(int x, int k) {
return (x & Integer.MIN_VALUE) | ((x << k) & Integer.MAX_VALUE);
}
但这真的有用吗?例如,它有一个可疑的属性,即每当结果与x << k
不同时,两个结果都不匹配(long)x << k
。从算术的角度来看,这似乎不是很有用。也许是,但至少这是一个奇怪的操作。像这样的操作可能还有其他用途,比如在bithack中,尽管我不知道有任何这样的用途。
发布于 2021-07-15 05:50:23
正常的左和右算术移位都保留符号位。所以
-32 >> 1 == -16
-16 << 1 == -32
因此,左算术移位在某种意义上是算术和逻辑的,因为算术和非算术比特操作都可以完成。
但需要特殊处理右逻辑移位,以移位符号位并在左侧填充0位。
-1 >>> 1 == 2147483647
如果要完成非算术比特操作,这是必不可少的。但是如何进行保留符号的左算术移位呢?
考虑一个4位寄存器,msb
是符号,它被保留。假设<<
操作符的工作方式如下
0111 == 7
0111 << 1 == 0110 == 6
0110 << 1 == 0100 == 4
0100 << 1 == 0000 == 0
国际海事组织,这不会有太大的用处。
https://stackoverflow.com/questions/68384618
复制相似问题