我正在研究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.获得了设置最左边位的技术。
发布于 2021-01-02 16:21:09
让我们分析一下(~0 ^ (~0 >> 1) )
~0
是-1
~0 >> 1
又是-1
,如果符号位是1
,rightshift将用1
来填充新位。
-1 ^ -1
是0
。
x = x | 0
是x
。
解决方案是,如果要执行位操作,则应使用无符号数据类型。
所以您应该使用行x = x | (~0u ^ (~0u >> 1) );
为了避免其他问题,参数x
也应该是unsigned int
。
https://stackoverflow.com/questions/65541209
复制相似问题