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

时间:2016-05-11 13:16:01

标签: bit-manipulation bitwise-operators kernighan-and-ritchie

在第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);
}

我实际上并没有遇到按位运算符的问题,但实际上我无法得到问题。我坚持理解这个问题主要是解决它。 最终“我们需要在这个功能中找到什么”。

2 个答案:

答案 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