在第2.9章的K& R书中,我不得不理解这个样本函数getbits()
getbits(x,p,n)
返回从位置p开始的x的(右侧调整的)n位字段。这是函数体
/* getbits: get n bits from from position p */
unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
我实际上并没有遇到按位运算符的问题,但实际上我无法得到问题。我坚持理解这个问题主要是解决它。 最终“我们需要在这个功能中找到什么”。
答案 0 :(得分:1)
它只是将位右移p+1-n
位(使所需字段右对齐),然后屏蔽掉除n
位以外的所有位。这是一个扩展版本,可能更容易理解:
unsigned getbits(unsigned x, int p, int n)
{
unsigned x_right = (x >> (p+1-n)); // shift right to make required bits right-justified
unsigned mask = ~(~0 << n); // create n bit mask
return x_right & mask; // return required bits
}
答案 1 :(得分:0)
绘制二进制表示通常有助于此类情况。
例如:从位置5取3位:
X: 101010101
--^
p
它改变了:
X: 1010
^
p
然后掩饰:
X: 010
--^
p