请解释逻辑右移,右移右移和向右旋转之间的区别

时间:2017-06-22 09:06:10

标签: bit-manipulation bitwise-operators bit bit-shift

我一直在阅读经典黑客的喜悦,我无法理解逻辑右移,算术右移和向右旋转之间的区别。如果怀疑看起来太简单,请原谅。

Also why is there no arithmatic shift left?

3 个答案:

答案 0 :(得分:15)

首先要记住,机器字的大小是固定的。说4,你的输入是:

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

然后向左推一个位置给出:

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

问什么作为X?

  1. shift put 0
  2. 使用旋转放置a
  3. 现在向右推一个位置给出:

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

    问什么作为X?

    1. 逻辑移位放0
    2. 使用算术转换放置a
    3. 使用旋转放置d
    4. 大致。

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

      算术移位与签名数字的2&x补码表示有关。在此表示中,符号是最左边的位,然后算术移位保留符号(这称为符号扩展)。

      旋转没有普通的数学意义,即使在计算机上也几乎是一个过时的操作。

答案 1 :(得分:4)

差异在最右边的专栏中得到了很好的解释。

  • 逻辑移位将数字视为一堆位,并以零的形式移位。这是C中的>>运算符。
  • 算术移位将数字视为有符号整数(以2s补码表示),并“保留”最高位,如果最高位为0则移位为零,如果为1则移位为1。如果被移位的数字为负,则C的右移运算符具有实现定义的行为。

    例如,二进制数11100101(-27为十进制,假设为2s补码),当右使用逻辑移位的3位移位变为00011100(小数28)。这显然令人困惑。使用算术移位,符号位将保留,结果将变为11111100(十进制-4,约为-27 / 8)。

  • 旋转既没有,也没有,因为最高位被最低位替换。 C没有操作员进行轮换。

答案 2 :(得分:1)

逻辑右移表示向右移位,而MSB(最高有效位)变为0。

示例:数字1 0 1 1 0 1 0 1的逻辑右移是 0 1 0 1 1 0 1 0。

算术右移表示向右移位,并且MSB(最高有效位)与原始数字相同。

示例:数字的算术右移 1 0 1 1 0 1 0 1为 1 1 0 1 1 0 1 0。