首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解释包含位运算符的C语句的工具

解释包含位运算符的C语句的工具
EN

Stack Overflow用户
提问于 2012-03-28 15:29:16
回答 1查看 408关注 0票数 2

我一直在阅读Kernighan和Ritchie的“C编程语言”。

我发现很难通过节2.9位运算符

具体地说:

练习2-6编写一个函数集位(x,p,n,y),返回x,从位置p开始到y的最右边的n位,而其他位不变。

有一个名叫理查德·希斯菲尔德的聪明小伙子给出了练习这里的答案。

理查德的回答是:

代码语言:javascript
运行
复制
return (x & ((~0 << (p + 1))
           | (~(~0 << (p + 1 - n)))))
     | ((y & ~(~0 << n)) << (p + 1 - n));

问题

有人知道有什么工具可以解释像上面这样的代码行吗?

我希望存在一些类似于各种在线regex解释程序的东西,但适用于按位操作。

EN

回答 1

Stack Overflow用户

发布于 2012-03-28 15:53:06

让我们让这个人类可读的,好吗?

设x,y,p,n为输入,设temp1,temp2,temp3,和结果等于0,设temp1等于p+1 设temp1等于temp1左移0的1的补数 设temp1等于位数,设temp2等于p+1减n。 设temp2等于temp2左移0的1的补数 设temp2等于temp2的补元,temp1等于temp1的位或位,temp2设temp3等于p+1减n,temp2等于0的补元,左移n。 设temp2等于temp2的补 设temp2等于y和temp2的位,temp2等于temp3左移的temp2 设结果等于temp1和temp2的位OR

资料来源:我的大脑。

从这个C代码(从OP扩展):

代码语言:javascript
运行
复制
int setbits(int x, int p, int n, int y)
{
    int result = 0;

    // evaluate the expression
    {
        int temp1 = 0;
        int temp2 = 0;
        int temp3 = 0;

        temp1 = p + 1;
        temp1 = ~0 << temp1;
        temp1 = x & temp1;

        temp2 = p + 1 - n;
        temp2 = ~0 << temp2;
        temp2 = ~temp2;

        temp1 = temp1 | temp2;

        temp3 = p + 1 - n;

        temp2 = ~0 << n;
        temp2 = ~temp2;
        temp2 = y & temp2;

        temp2 = temp2 << temp3;
        result = temp1 | temp2;
    }

    assert(result == ((x & ((~0 << (p + 1))| (~(~0 << (p + 1 - n))))) | ((y & ~(~0 << n)) << (p + 1 - n))));

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

https://stackoverflow.com/questions/9910823

复制
相关文章

相似问题

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