显示设置的1的第32位

时间:2019-06-12 13:50:49

标签: c++ bit

当我计算一个数字中的设置位数时,我将输入设为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;
}

2 个答案:

答案 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--)