gpt4 book ai didi

c - 需要帮助理解 K&R C 第 2 章中的 "getbits()"方法

转载 作者:太空狗 更新时间:2023-10-29 16:23:19 25 4
gpt4 key购买 nike

在第 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 检查我的结果——感谢上帝它有二进制 View !)

有什么帮助吗?

最佳答案

让我们在示例中使用 16 位。在这种情况下,~0 等于

1111111111111111

当我们左移此 n 位(在您的情况下为 3 位)时,我们得到:

1111111111111000

因为左边的 1 被丢弃,而右边的 0 被送入。然后重新补充它给出:

0000000000000111

所以这只是一种在数字的最低有效部分中获取 n 1 位的聪明方法。

您描述的“x 位”已将给定数字 (f994 = 1111 1001 1001 0100) 右移得足够远,因此最低有效的 3 位就是您想要的。在此示例中,您请求的输入位就在那里,所有其他输入位都标记为 因为它们对最终结果并不重要:

ff94             ...........101..  # original number
>> p+1-n [2] .............101 # shift desired bits to right
& ~(~0 << n) [7] 0000000000000101 # clear all the other (left) bits

如您所见,您现在在最右边的位位置有相关的位。

关于c - 需要帮助理解 K&R C 第 2 章中的 "getbits()"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/197614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com