K&R:需要解释才能理解此 C 代码

K & R : Need Explanation in understanding this C code

在K&R书中第2.9章,我卡在理解这个示例函数上getbits()

getbits(x,p,n)

Returns 从位置 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);
}

我实际上没有遇到按位运算符的问题,但我实际上无法回答问题。我一直坚持理解这个问题,主要是不解决它。 最终 "What do we need to find in this function".

它只是将位右移 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
}

绘制二进制表示通常有助于解决这种情况。

例如:从位置5取3位:

 X: 101010101
     --^
       p

转移:

 X: 1010
       ^
       p

然后是口罩:

 X:  010
     --^
       p