题目:输入一个整数n,返回其二进制数中1的个数;
1.和自身减一按位与;n&(n-1)
按位与&规则:同1为1;其它为0;
例如:
9: 00001001
8(9-1): 00001000
9 & 8: 00001000
8 &7(8-1): 00000000
所以整数9中有2个二进制1;
二进制3: 00000011
二进制3(3-1): 00000010
3 & 2: 00000010
2 & 1: 00000000
所以整数3中有2个二进制1;
/***********************************************************
Create date:2019.10.17
Designer by:MaL
Compiling environment:Microsoft Visual Studio2012
from:剑指offer
************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
int Numberof1(int n)
{
int count = 0;
while(n>0)
{
++ count;
n = (n - 1) & n;
}
return count;
}
2,先将n与1做按位与运算(判断n的最低位是不是1),再将1左移得到2,在与n做按位与运算,判断n的次低位是不是1,循环下去,直到将n的二进制位遍历完(32位整数需要循环32次)。
int Numberof1(int n)
{
int count = 0;
unsigned int flag = 1;
while(flag)
{
if(n & flag)
count++;
flag = flag << 1;
}
return count;
}
测试用例: