C++ 使用无符号整数时的无循环
我写了一个函数,它必须返回二进制表示中位“1”的n。我观察到了(对我来说)意想不到的行为 当我在C++ 使用无符号整数时的无循环,c++,C++,我写了一个函数,它必须返回二进制表示中位“1”的n。我观察到了(对我来说)意想不到的行为 当我在for循环中使用unsigned inttype时,函数陷入了一个无休止的循环,我不知道为什么 unsigned int countBits(unsigned long long n) { //your code here int nofbits= log2(n)+1, nofone=0; for(int i=nofbits;i>=0;--i) {
for
循环中使用unsigned int
type时,函数陷入了一个无休止的循环,我不知道为什么
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;
}
无止境循环
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;
}
它将始终大于0,因为它是未签名的。无符号数字只能>=0
Remy Lebeau在评论中说,当你从一个无符号的0中减去1时,它将以一个非常大的数字结束:4294967295
它将始终大于0,因为它是未签名的。无符号数字只能>=0
Remy Lebeau在评论中说,当你从一个无符号0中减去1时,它将以一个非常大的数字结束:4294967295正如类型名称所示,
无符号int
永远不会变为负数。递减无符号整数值0
将导致无符号整数值可以具有的最大值。因此,i>=0
与i
类型为unsigned int
的比较将始终为true
,正如类型名称所示,unsigned int
永远不会变为负值。递减无符号整数值0
将导致无符号整数值可以具有的最大值。因此,像i>=0
与i
类型为unsigned int
的比较总是true
是那些log2
和pow
实际上std::log2
和std::pow
不相关的:整数的幂2最好用左移位处理。它可以更快、更快,并且不受在整数和浮点表示之间来回翻转所引入的错误的影响。那些log2
和pow
实际上是std::log2
和std::pow
吗?不相关:整数2与整数幂的关系最好用左移位处理。它可以更快、更快,并且不受在整数和浮点表示之间来回翻转所引入的错误的影响。
for(unsigned i=nofbits;i>=0;--i)