【发布时间】:2020-06-22 21:09:38
【问题描述】:
我编写了一个函数,它必须以二进制表示形式返回位“1”的 n。我观察到(对我而言)出乎意料的行为。
当我在for 循环中使用unsigned int 类型时,函数会陷入无限循环,我不知道为什么。
unsigned int countBits(unsigned long long n)
{
//your code here
int nofbits= log2(n)+1,
nofone=0;
for(int i=nofbits;i>=0;--i)
{
if(n-pow(2,i)>=0)
{
nofone++;
n=n-pow(2,i);
}
}
return nofone;
}
vs 无限循环
unsigned int countBits(unsigned long long n)
{
//your code here
int nofbits= log2(n)+1,
nofone=0;
for(unsigned i=nofbits;i>=0;--i)
{
if(n-pow(2,i)>=0)
{
nofone++;
n=n-pow(2,i);
}
}
return nofone;
}
【问题讨论】:
-
那些
log2和pow实际上是std::log2和std::pow吗? -
不相关:整数 2 的整数次幂最好用左移来处理。它可以更快、更快,并且不受在整数和浮点表示之间来回翻转所引入的错误的影响。
标签: c++