gpt4 book ai didi

c - 尾随零 - C

转载 作者:行者123 更新时间:2023-12-02 15:38:26 25 4
gpt4 key购买 nike

我需要一个程序,它返回数字的二进制表示形式中尾随零的数量。我在网上找到了一个用C编写的函数,但我不明白它是如何工作的

这是函数:

unsigned tzr(unsigned x) 
{
unsigned n; /* number of bits */

n = 0;
if (!(x & 0x0000FFFF)) { n += 16; x >>= 16; }
if (!(x & 0x000000FF)) { n += 8; x >>= 8; }
if (!(x & 0x0000000F)) { n += 4; x >>= 4; }
if (!(x & 0x00000003)) { n += 2; x >>= 2; }

n += (x & 1) ^ 1; // anyway what does this do ?

return n;
}

现在我真的试图理解它是如何工作的,但我不明白。我真的需要有人可以向我解释它,我发现这段代码非常复杂。

关于这些十六进制常量,这些是它们的值:

0x0000FFFF = 65535
0x000000FF = 255
0x0000000F = 15
0x00000003 = 3

现在,为什么程序使用这些值并与数字进行按位与运算?

然后我知道,如果你想处理大数字,你必须
使用 while 代替第一个 if 语句,如下所示:

while (!(x & 0x0000FFFF)) { 位 += 16; x >>= 16; }//为什么我需要这个?

但是我不知道为什么!在这种情况下,使用 while 代替 if 有什么区别?

最佳答案

将十六进制常量与值进行“与”运算,以检查最后 [number] 位数字是否为零。0x0000FFFF 是一个具有 16 个 1 的二进制数。如果与 0x0000FFFF 进行 AND 运算的值等于 0,则您知道最后 16 位数字为零(if 检查该语句的相反情况)。再进一步,0x000000FF 是一个二进制的 8 个数字。下一次检查是最后 8 位数字,接下来是 4 位数字,最后一位是 2 位数字,因为 0x00000003 是二进制的 11。检查后,数字将被移动以检查其他数字是否也为零。这样我们就可以检查任意数量的尾随零,因为这些值是 2 的幂,并且将它们相加的工作方式与使用二进制完全相同。

最后一个语句在所有先前的移位完成后检查最后一位数字 - 与 1 进行 AND 并使用 XOR(^) 检查它是 0 还是 1。

该程序检查 32 位数字。您可以将第一个 if 更改为 while 以检查更大的值,例如64 位,数字。另一种方法是使用 0xFFFFFFFF 进行检查,然后一次移位 32 位。

关于c - 尾随零 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45270401/

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