"写一个函数rightrot(x,n),它返回整数x的值,向右旋转n位位置。"
只是为了澄清我是否正确理解这一点,这是要求我将从右侧的位大小移出的位重新出现在左侧。例如,使用8位:
10111001
>> 2
01101110
答案 0 :(得分:1)
也许你不需要这个,但试着预测我要补充的其他问题。在您给出的示例中,旋转8或16与完全不旋转相同,因此mod运算符将是有用的。
答案 1 :(得分:1)
是的,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;
其他移位/旋转通过进位位工作,但这更像是硬件级功能。