1.二进制中 1 的个数 - 蓝桥云课 (lanqiao.cn)
整数最多只能左移31位(0~31)
1移动31位后结果如下:
现在我们再向右移动两位:
bitset<32> bits((x << 31)>>2);
这是因为符号位为1,也就是负数。负数右移会补1。
如果我们把x设为unsigned类型,再运行,结果如下:
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;
}
但是这样写还是有问题的,如下:
问题就是我们上面说的,当符号号为1的时候我们右移动实际上移几位就会补几个1,这样不论怎么移最后永远都不会变为0,循环就不会结束。
因此我们需要把x的类型改为unsigned: