当我计算一个数字中的设置位数时,我将输入设为1 发现ans是2 当我调试程序的32位被设置时,怎么可能呢? 因为在1中仅设置了第一位
#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int ans = 0;
for(int i=32;i>=0;i--){
if(n&(1<<i))
ans++;
}
cout<<ans<<endl;
}
return 0;
}
答案 0 :(得分:0)
32至0(包括2和3)总共为33位,您在这里偏离一位:
for(int i=32;i>=0;i--){
if(n&(1<<i)) ans++;
std::cout << i << "\n";
}
我添加了一个cout
,可让您进行验证。相反,您应该从31开始循环,即
for(int i=31;i>=0;i--){
请注意,只要您关心数字的位表示,std::bitset
就非常方便。
PS:实际上,我想知道为什么您要将循环反转了。当您编写更常见的for (int i=0;i<32;++i)
答案 1 :(得分:0)
问题出在第一次迭代中。您将数字1移位32位,这在我的机器上将得出1。由于int可能是32位,所以这不是定义的行为。
if(n&(1<<32)!=0)
解决方法是从31开始。
for(int i=31;i>=0;i--)