写一个函数rightrot(x,n),它返回整数x的值,x向右旋转n位
为了澄清我是否正确理解了这一点,这要求我将从右边的位大小移出的位重新显示在左边。例如,使用8位:
10111001
>> 2
01101110
最佳答案
是的,K&R练习2.8是右转(不是通过进位)。
所有类型的转换都可以实现:
逻辑移位:右
将每个位移到下一个最低有效位置。LSBit被丢弃。MSbit变为0。unsigned x; x >>= 1;
逻辑移位:左
将每个位移到下一个最重要的位置。已放弃MSBit。LSBit变为0。unsigned x; x <<= 1;
旋转移位:左
将每个位移到下一个最重要的位置。MSBit变为LSBit。unsigned x; x = (x << 1) | x >> (sizeof x * CHAR_BIT - 1);
旋转移位:右
将每个位移到下一个最低有效位置。LSBit变为MSBit。unsigned x; x = (x >> 1) | x << (sizeof x * CHAR_BIT - 1);
算术移位:左
将每个位移到下一个最重要的位置。LSBit变为0。如果MSBit(符号位)发生变化,则不同的计算机处理这种情况的方式不同。这就是UB。
[假设2的补码]int x; x <<= 1
算术移位:右
将每个位移到下一个最低有效位置。MSBit保持不变。LSBit被丢弃。
[假设2的补码]int x; x >>= 1;
其他移位/旋转通过进位工作,但这更多的是硬件级功能。