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

Cha*_*ori 9 bit-manipulation bit-shift bit bitwise-operators

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

还有为什么没有算术转移呢?

Jea*_*nès 21

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

+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

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

+---+---+---+---+
| b | c | d | X |
+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

问什么放X?

  1. 放0
  2. 旋转a

现在把一个位置推到右边给出:

+---+---+---+---+
| X | a | b | c |
+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

问什么放X?

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

大致.

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

算术移位与有符号数的二进制补码表示有关.在此表示中,符号是最左边的位,然后算术移位保留符号(这称为符号扩展).

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

  • 逻辑移位不会除以 2 和乘以 2。例如,-75 >>> 1 = 90。算术移位保留符号,从而乘以和除以 2 (2认同)
  • 值得注意的是,算术右移向“-Infinity”舍入,而普通的有符号除法(在 C 中)则向 0 截断。因此,为有符号 x 编译“x/2”需要在 SAR 指令之上进行一些符号位欺骗。 (2认同)

小智 13

逻辑右移是指将位向右移动,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。


unw*_*ind 6

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

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

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

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