【发布时间】:2022-05-02 22:40:57
【问题描述】:
我编写了一个函数trailing_zeroes(int n),它返回数字的二进制表示中尾随零的数量。
例子:4二进制是100,所以本例中的函数返回2。
unsigned trailing_zeroes(int n) {
unsigned bits;
bits = 0;
while (n >= 0 && !(n & 01)) {
++bits;
if (n != 0)
n >>= 1;
else
break;
}
return bits;
}
if语句的原因是因为如果n等于0,就会出现循环。
我觉得这样写的代码很丑;有没有更好的办法?
我想避免在while 中使用break 语句,因为很多人告诉我在while/for 中使用该语句有时可能是“非正式的”。我想像这样重写函数,但我认为这不是最好的方法:
unsigned bits;
if (n == 0)
return bits = 1;
bits = 0;
while (!(n & 01)) {
++bits;
n >>= 1;
}
【问题讨论】:
-
试试
__builtin_ctz。 -
最简单的方法可能是转换为
std::string并检查那个。 -
您的具体问题是什么?我们不是代码审查服务(作为旁注:代码对
n的某些值具有实现定义的行为)。 -
提示:避免使用 C 和 C++。虽然问题可能与两种语言都相关,但最佳答案可能是特定语言的。
-
我不知道为什么 GCC 中的
__builtin_ctz给出了一个未定义的结果为零,但是(guesswork)这可能是因为不同平台上的本机实现产生不同结果——这两个结果很可能是零和整数类型的位数。但 GCC 并没有使结果特定于平台,而是使其未定义,因此可移植代码不会使用零参数调用函数。
标签: c++ c while-loop bitwise-operators