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?
a现在把一个位置推到右边给出:
+---+---+---+---+
| X | a | b | c |
+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)
问什么放X?
ad大致.
逻辑移位对应于(左移)乘以2,(右移)整数除以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。
在最右边的栏中几乎解释了差异。
>>C语言中的运算符。算术移位将数字视为有符号整数(以2s补码形式),并“保留”最高位,如果最高位为0,则移位为零;如果最高位为1,则移位为1。如果要移位的数字为负,则C的右移运算符具有实现定义的行为。
例如,11100101当使用逻辑移位向右移3位时,二进制数(十进制为-27,假定补码为2s)变为00011100(十进制28)。这显然令人困惑。使用算术移位,将保留符号位,结果将变为11111100(十进制-4,对于-27 / 8大约正确)。
旋转都不行,因为最高位被最低位代替。C没有操作员可以旋转。