相关题目链接:二进制中1的个数
基础方法:按位与1,求出最后一位是0还是1
int NumberOf1(int a ) {
// write code here
int tmp = a;
int count = 0;
if (a >= 0)
{
while (a)
{
if (a & 1) {//可以判断出当前a最后一位是1还是0
count++;
}
a = a >> 1;
}
}
else
{
//负数右移,我这个编译器是算术右移(大多数编译器都是算术右移)
//算术右移就是,最右边数丢弃,左边补符号位,因为是负数也就是补1
//这里如果还用while(a)就会一直死循环下去,因为左边会一直补1
//但我们是知道整形是32位存储在内存里面的,我们循环32次即可
for (int i = 0;i < 32;i++)
{
if (a & 1) {//可以判断出当前a最后一位是1还是0
count++;
}
a = a >> 1;
}
}
return count;
}
进阶方法::n=n&(n-1),把最末位的1去掉
举个例子:
n=5,二进制为0101
n-1=4,二进制为0100
n=n&n-1=0100,也就是十进制的4
到这里0101的最后一位1被移除
n=4,二进制为0100
n-1=3,二进制为0011
n=n&n-1=0000
到这里,0100最后一位1被移除,变成了0,循环结束
int NumberOf1(int a ) {
// write code here
int count = 0;
while(a)
{
a=a&(a-1);
count++;
}
return count;
}
牛客网测试通过截图