【发布时间】:2017-12-29 10:30:53
【问题描述】:
我需要一个程序来返回数字的二进制表示中尾随零的数量。我在网上找到了一个用 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 = 655350x000000FF = 2550x0000000F = 150x00000003 = 3
现在,为什么程序使用这些值并与数字进行按位与?
那么我知道,如果你想处理大数字,你必须
使用while 而不是第一个if 语句,如下所示:
while (!(x & 0x0000FFFF)) { bits += 16; x >>= 16; } // why should I need this ?
但我不知道为什么!在这种情况下使用while 而不是if 有什么区别?
【问题讨论】:
-
看看那些十六进制数的二进制表示,你就应该明白了。十六进制
F是二进制1111。 -
尝试各种随机输入。甚至可能在每一步之后将输出语句添加到您的程序中
-
“我在街上发现了一些东西,请解释一下它是什么”。这不是堆栈溢出的工作原理。
-
@Olaf 我真的很抱歉。我不知道在哪里可以找到任何帮助。我发布这个是因为我看到很多关于人们发布代码要求某人帮助他们的帖子,所以我想我也可以这样做
-
n += (x & 1) ^ 1 检查 LSB,这是移位或不移位的结果。在此位之后,不需要移位,这就是不使用 if 语句的原因。
标签: c bitwise-operators trailing