我正在做 K&R 中的练习 2-8,它要求我们编写函数 rightrot(int x, int n)
以便 x
的所有位都被移位向右 n 次,从右端掉落的位重新出现在左端。
这是我尝试的解决方案,我逐位移动:
int rightrot(int x, int n)
{
int i, rmb;
for(i = 0; i < n; ++i)
{
// get right-most bit
rmb = x & 1;
// shift 1 to right
x = x >> 1;
// if right-most bit is set, set left-most bit
if (rmb == 1)
x = x | (~0 ^ (~0 >> 1) );
}
return x;
}
当我执行 rightrot(122, 2)
时,我希望得到 94
,因为 122
是 1111010
94
是 1011110
。相反,我得到了 30
,它恰好是 0011110
。显然,我设置最左边位的方法没有像我预期的那样工作。有没有人发现一个明显的错误?我只是在学习捕获比特之类的东西。
注意:我从 this post. 获得了设置最左边位的技术
最佳答案
我们来分析一下(~0 ^ (~0 >> 1))
:
~0
是 -1
~0 >> 1
又是 -1
,如果符号位是 1
右移将用 1填充新位
s.
-1 ^ -1
是 0
。
x = x | 0
是 x
。
解决方案是,如果你想进行位操作,你应该使用无符号数据类型。
所以你应该使用 x = x | 行。 (~0u ^ (~0u >> 1) );
为了避免其他问题,参数 x
也应该是 unsigned int
。
关于c - C中位的右循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65541209/