【发布时间】:2010-09-16 21:23:59
【问题描述】:
在第 2 章,关于位运算符的部分(第 2.9 节)中,我无法理解其中一种示例方法的工作原理。
提供的方法如下:
unsigned int getbits(unsigned int x, int p, int n) {
return (x >> (p + 1 - n)) & ~(~0 << n);
}
这个想法是,对于给定的数字 x,它将返回从位置 p 开始的 n 位,从右数(最右边的位是位置 0)。给定以下main() 方法:
int main(void) {
int x = 0xF994, p = 4, n = 3;
int z = getbits(x, p, n);
printf("getbits(%u (%x), %d, %d) = %u (%X)\n", x, x, p, n, z, z);
return 0;
}
输出是:
getbits(63892 (f994), 4, 3) = 5 (5)
我得到了其中的一部分,但在“大局”方面遇到了麻烦,主要是因为我不理解的部分(不是双关语)。
我特别有问题的部分是补充部分:~(~0 << n)。我想我得到了第一部分,处理 x;这是我正在努力解决的部分(然后是掩码)——以及它们是如何结合在一起来实际检索这些位的。 (我已经验证了它正在做的事情,包括代码和使用 calc.exe 检查我的结果——感谢上帝,它有一个二进制视图!)
有什么帮助吗?
【问题讨论】:
标签: c operators bit-manipulation bit-shift complement