二进制中1的个数
这道题是剑指offer第15道题
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
第一种思路:我们通过对这个数的二进制每一位和1进行“与运算”,如果为1,那么就累加1的个数
如对于十进制5:二进制为101,我们通过其每个位与二进制数1,10,100进行与运算,那么也就是对于二进制1,不断地进行左移,就可以出现1,10,100,1000等的数。但是存在一个问题,我们不知道这个数的二进制有多少位,就存在32位的一个溢出直至为0。
代码如下:
public class Solution {
public int hammingWeight(int n) {
int sum=0;//记录1的个数
int temp=1;//用来n的每一位是否是1 如temp=1、10、100
while(temp!=0){
sum=(n&temp)!=0?sum+1:sum;//如果为零sum就加一
temp=temp<<1;//temp左移,从n的最低位向最高位进行与运算
}
return sum;
}
}
第二种思路:通过n = n&(n-1),将这个数从右往左数的第一个位置的1消除
public class Solution1 {
public int NumberOf1(int n) {
int sum=0;//记录1的个数
while(n!=0){ // 说明当前n的二进制表示中肯定有1
sum++;
n = n&(n-1);// 本质上就是消除从右往左数的第一个位置的1
}
return sum;
}
}