逻辑右移,算术右移和右移之间的差

问题描述 投票:9回答:2

我一直在阅读经典的Hacker的喜悦,但我很难理解逻辑右移,算术右移和右移之间的区别。如果怀疑似乎太简单了,请原谅。

Also why is there no arithmetic shift left?

bit-manipulation bitwise-operators bit bit-shift
2个回答
21
投票

[请记住,机器字的大小是固定的。说4,您的输入是:

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+

然后将所有内容向左移动一个位置:

+---+---+---+---+
| b | c | d | X |
+---+---+---+---+

问什么要输入X?

  1. shift放0
  2. 旋转放置a

现在将所有内容向右推一个位置:

+---+---+---+---+
| X | a | b | c |
+---+---+---+---+

问什么要输入X?

  1. 逻辑移位放置0
  2. 算术移位放置a
  3. 旋转放置d

大致。

逻辑移位对应于(左移位)乘以2,(右移位)整数除以2。

算术移位与带符号的2的补码表示形式有关。在此表示形式中,符号是最左边的位,然后算术移位将保留符号(这称为符号扩展)。

Rotate没有一般的数学含义,即使在计算机中也几乎是过时的操作。


6
投票

在最右边的栏中几乎解释了差异。

  • 逻辑移位将数字视为一堆位,并移位为零。这是C中的>>运算符。
  • 算术移位将数字视为有符号整数(以2s补码形式),并“保留”最高位,如果最高位为0,则移位为零;如果最高位为1,则移位为零。如果要移位的数字为负,则C的右移运算符具有实现定义的行为。例如,当使用逻辑移位右移3位时,二进制数11100101(十进制为-27,假定为2s补码)变为00011100(十进制28)。这显然令人困惑。使用算术移位,将保留符号位,并且结果将变为11111100(十进制-4,对于-27 / 8大约正确)。

  • Rotation都不做,因为最高位被最低位代替。 C没有操作员可以旋转。

© www.soinside.com 2019 - 2024. All rights reserved.