K& R练习2.8

时间:2014-08-16 03:42:08

标签: c

"写一个函数rightrot(x,n),它返回整数x的值,向右旋转n位位置。"

只是为了澄清我是否正确理解这一点,这是要求我将从右侧的位大小移出的位重新出现在左侧。例如,使用8位:

10111001
>> 2
01101110

2 个答案:

答案 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;

其他移位/旋转通过进位位工作,但这更像是硬件级功能。