c - C中位的右循环

标签 c

我正在做 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,因为 1221111010 941011110。相反,我得到了 30,它恰好是 0011110。显然,我设置最左边位的方法没有像我预期的那样工作。有没有人发现一个明显的错误?我只是在学习捕获比特之类的东西。

注意:我从 this post. 获得了设置最左边位的技术

最佳答案

我们来分析一下(~0 ^ (~0 >> 1)):

~0-1
~0 >> 1 又是 -1,如果符号位是 1 右移将用 1s.
-1 ^ -10
x = x | 0x

解决方案是,如果你想进行位操作,你应该使用无符号数据类型。

所以你应该使用 x = x | 行。 (~0u ^ (~0u >> 1) );
为了避免其他问题,参数 x 也应该是 unsigned int

https://ideone.com/7zPTQk

关于c - C中位的右循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65541209/

相关文章:

c - 3 字节有符号值到 4 字节有符号值

使用宏时 C 结构数组初始化问题

c - 优化设置

有人能告诉我为什么我会在这个简单的 C 程序中出现段错误吗?

java - 如何让Java类监听C程序 "stdout"上的事件

c - 这个 print_repeat 函数有什么问题?

c - 查找默认未包含的 C 库

将十六进制流复制到字符缓冲区中以通过网络发送

c - 如何制作包含结构的堆栈?

c - 如何使 switch 语句正确循环?