首先要记住机器字是固定大小的。比如说4,而且你的输入是:
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
然后将所有内容向左移动一个位置,得到:
+---+---+---+---+
| b | c | d | X |
+---+---+---+---+
问题是将什么放在X的位置上?
a
放置在X的位置。现在将所有元素向右移动一个位置,得到:
+---+---+---+---+
| X | a | b | c |
+---+---+---+---+
如何确定X的值?
大致如此。
逻辑移位对应于(左移)乘以2,(右移)除以2。
算术移位是与带符号数字的二进制补码表示相关的。在这种表示中,符号是最左边的位,然后算术移位保留符号(这称为符号扩展)。
循环移位没有普通的数学意义,甚至在计算机中也几乎已经过时了。
x/2
需要在SAR指令之上进行一些符号位技巧。 - Peter Cordes这个区别在最右边的一列中解释得很清楚了。
>>
运算符。算术移位将数字视为带符号整数(采用2的补码表示法),并“保留”最高位,如果最高位为0,则填充0,如果最高位为1,则填充1。如果被移位的数字为负数,则C语言的右移运算符具有实现定义的行为。
例如,二进制数11100101
(假设采用2的补码表示法,在十进制下为-27),使用逻辑移位向右移动3位后,变为00011100
(十进制28)。这显然令人困惑。使用算术移位,符号位将被保留,结果将变为11111100
(十进制-4,对于-27/8来说大约是正确的)。
旋转则不做此类操作,因为最高位会被低位替换。C语言没有旋转运算符。
逻辑右移是将比特位向右移动,并将最高有效位(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。