题目描述:
给一个整数N,确认它的二进制数中1的个数。
解法一
位运算:每次将1向左移动一位,和N做&与运算,再和“1向左移动一位”的那个数做比较,如果相等,说明这个二进制数位置为1,count++。
int main()
{
int N,count;
cin>>N;
for(int i=0;i<32;i++) //整形有32位,就循环32次
{
if((N&(1<<i))==(1<<i))
{
count++;
}
}
cout<<count<<endl;
return 0;
}
解法二
让N每次向右移动一次,1不动,每次和1判断是否相等。
int count=0;
for(int i=0;i<32;i++)
{
if((N>>i)&1==1)
{
count++;
}
}
cout<<count<<endl;
解法三
原理:
每次让N和N-1做&运算,每做一次运算,最末尾的1就会被消掉。其他位不变。
解释:
N-1会将N最右边的1给消掉,然后这个1之后的每一位变成1,比如二进制1000,减1后,变为0111。
所以N和N-1最低位之后的部分都是相反的,做&运算,后面这一部分就被消掉了
所以每做一次运算,最低位的1就会被消掉。
代码:
while(N)
{
N=N&(N-1); //每做一次与运算,会消掉一个1.直到N为0
count++;
}