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
在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