用于解释包含按位运算符的C语句的工具

时间:2012-03-28 15:29:17

标签: c bitwise-operators

我一直在阅读Kernighan和Ritchie的“The C Programming Language”。

我发现很难通过 2.9 Bitwise Operators

部分

具体做法是:

  

练习2-6写一个函数setbits(x,p,n,y),它返回x   从位置p开始的n位设置为y的最右边的n位,   保持其他位不变。

有一个名叫理查德希思菲尔德的聪明人,有here的练习答案。

理查德的回答是:

return (x & ((~0 << (p + 1))
           | (~(~0 << (p + 1 - n)))))
     | ((y & ~(~0 << n)) << (p + 1 - n));

问题

有没有人知道一个工具可以解释上面的代码行?

我希望存在类似于各种在线正则表达式解释器的东西,但是对于按位操作。

1 个答案:

答案 0 :(得分:2)

让这个人类可读,我们呢?

  

x y p n 输入

  让 temp1 temp2 temp3 结果等于零

  让 temp1 等于 p 加1   让 temp1 等于 temp1 左移的0的补码   让 temp1 等于 x temp1 的按位AND   让 temp2 等于 p 加1减去 n
  让 temp2 等于 temp2 左移0的一个补码   让 temp2 等于 temp2的补码

  让 temp1 等于 temp1 temp2 的逐位OR   让 temp3 等于 p 加1减去 n

  让 temp2 等于 n 左移的0的补码   让 temp2 等于 temp2 的一个补码   让 temp2 等于 y temp2 的按位AND   让 temp2 等于 temp3 左移 temp3
  让结果等于 temp1 temp2

的按位OR

来源:我的大脑。

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

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;
}