我一直在阅读Kernighan和Ritchie的“C编程语言”。
我发现很难通过节2.9位运算符
具体地说:
练习2-6编写一个函数集位(x,p,n,y),返回x,从位置p开始到y的最右边的n位,而其他位不变。
有一个名叫理查德·希斯菲尔德的聪明小伙子给出了练习这里的答案。
理查德的回答是:
return (x & ((~0 << (p + 1))
| (~(~0 << (p + 1 - n)))))
| ((y & ~(~0 << n)) << (p + 1 - n));问题
有人知道有什么工具可以解释像上面这样的代码行吗?
我希望存在一些类似于各种在线regex解释程序的东西,但适用于按位操作。
发布于 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扩展):
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;
}https://stackoverflow.com/questions/9910823
复制相似问题