首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中位的右旋转

C中位的右旋转
EN

Stack Overflow用户
提问于 2021-01-02 16:05:36
回答 1查看 131关注 0票数 3

我正在研究K&R中的练习2-8,它要求我们编写函数rightrot(int x, int n),这样所有的x位数都会向右移动n次,而从右边掉下来的位会在左边出现。

下面是我尝试的解决方案,在这个解决方案中,我一个一个地移动每一位:

代码语言:javascript
运行
复制
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,因为1221111010941011110。相反,我得到了30,它恰好是0011110。显然,我设置最左边位的方法并不如我所期望的那样有效。有人发现明显的错误吗?我只是在学习捕捉比特之类的东西。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-02 16:21:09

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

~0-1

~0 >> 1又是-1,如果符号位是1,rightshift将用1来填充新位。

-1 ^ -10

x = x | 0x

解决方案是,如果要执行位操作,则应使用无符号数据类型。

所以您应该使用行x = x | (~0u ^ (~0u >> 1) );

为了避免其他问题,参数x也应该是unsigned int

https://ideone.com/7zPTQk

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65541209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档