二进制中1的个数
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
思路一
通过除2取余,将余数存到数组中,分别对正负数进行处理。比较繁琐,容易出错,遗漏特殊情况
思路二
把十进制看成二进制,通过位与和移位,判断每一位是否为1
怎么取移位的结果?
方式一:
n&1 这样就能取出最后一位,再循环右移n>>=1 (只能用于正数),这里用n>>>1即可解决
方式二:
(n-1)&n 这个操作可以将n二进制数最右边的一个1转为0,循环操作知道为0。(不需要像 方式一 那样取32次)
例:
二进制数 1100 减1 -> 1011
1011 & 1100 (即(n-1)&n) -> 1000
代码
方式一
public int NumberOf1(int n) {
int count = 0;
while(n != 0){
if((n & 1) == 1) count++;
n = n>>>1;
}
return count;
}
方式二
public int NumberOf1(int n) {
int count = 0;
while(n != 0){
n = (n-1) & n;
count++;
}
return count;
}