Bitwise operator (C),该如何处理
Bitwise operator (C)/*getbits: get n bits from position p*/ unsigned getbits(unsigned x, int p, int
Bitwise operator (C)
/*getbits: get n bits from position p*/
unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
这个是关于位运算符(bitwise operator)的一个function, 意思是在x(二进制)中,在第P位开始(默认最右端为第0位),取n个bits。比如getbits(x, 4, 3)就是从x中第4位开始取3个bits(第四位,第三位,第二位)
但是这地方我逻辑没弄清楚,让我们按这个function做一个分析
ex: getbits(5, 4, 3)
那么x = 5 (转成二进制就是00000101)
p = 4 (从第四位开始)
n = 3 (取三个bits)
所以这一部分 x >> (p+1-n) 其实就是 5 >> 2 即 00000101向右移动两位变成00000001 (x从5变成1)
而另一部分 ~(~0 << n) 分开来看就是 ~0 (即11111111)
~0 << 3 (即从11111111向左移动三位变成11111000)
~(~0 << 3) (即这部分最终结果为 00000111)
结合起来 (x >> (p+1-n) & ~(~0 << n) 即等于 00000001 & 00000111 = 00000001
所以最后的结果还是 00000001 明显不符合我们的要求
是这个函数有问题还是分析有问题还有什么概念上的错误? C
[解决办法]函数没错,
你分析得也没错.
错误的地方在于 00000001 这个结果是符合题目要求的. 而你确说他"明显"不符合....
注意最右端的位是第零位开始的, 不是第一位.