我一直在阅读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));
问题
有没有人知道一个工具可以解释上面的代码行?
我希望存在类似于各种在线正则表达式解释器的东西,但是对于按位操作。
答案 0 :(得分:2)
让这个人类可读,我们呢?
让 x , y , p , n 输入
的按位OR
让 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
来源:我的大脑。
从这个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;
}