在第 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 检查我的结果——感谢上帝,它有一个二进制视图!)
有什么帮助吗?