二进制中 1 的个数

79 阅读1分钟

1.二进制中 1 的个数 - 蓝桥云课 (lanqiao.cn)

整数最多只能左移31位(0~31) image.png

image.png 1移动31位后结果如下:

image.png

现在我们再向右移动两位:

bitset<32> bits((x << 31)>>2);

image.png 这是因为符号位为1,也就是负数。负数右移会补1。

如果我们把x设为unsigned类型,再运行,结果如下:

image.png

ok,我们现在可以写这道题了。

思想

我们可以用把输入的x从最高位开始每次异或1就可以得到 当前位是1还是0。

是1就计数器统计一下,统计完就右移一位,继续判断下一位。

#include <iostream>

using namespace std;
int main()
{
    int x=0;cin>>x;
    
    int ans;
    while(x)
    {   
        if(x&1)ans++;
		x>>=1;  
	}
	cout<<ans<<endl;
    return 0;
}

但是这样写还是有问题的,如下: image.png

问题就是我们上面说的,当符号号为1的时候我们右移动实际上移几位就会补几个1,这样不论怎么移最后永远都不会变为0,循环就不会结束。

因此我们需要把x的类型改为unsigned:

image.png