二进制中1的个数
描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
代码
public class Solution {
public int NumberOf1(int n) {
int count = 0;
for(int i = 31;i >= 0; i--) {
if ((n >>> i & 1) == 1)
count++;
}
return count;
}
}
思路
- 本题用到了位运算的操作,比辗转相除法效率要高,整形 int 有32位,所以可以利用位运算符
>>>
从左到右将高位移至最低位,再与1做与&
运算,即可统计1的个数; - 数在计算机中是以补码表示的,正数的原码反码补码都是相同的,负数的补码是原码取反+1(符号位不变),题目中也说明了负数是用补码表示的,如果用其他方法的话需要考虑负数的补码的问题。
- 在书上还看到一种更简洁的方法,利用的思路是:把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于把整数的二进制表示中最右边的1变为0。代码如下:
代码2:
public int NumberOf1(int n) {
int count = 0;
while (n != 0) {
count++;
n = (n - 1) & n;
}
return count;
}