二进制中1的个数
2018-07-16 本文已影响3人
lvlvforever
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
第一种
用1去和n做与运算,然后检查最低位是否是1,然后将n做无符号右移操作。有符号的右移是>>,无符号的右移是>>>。这两者的区别主要在于对负数的移位操作,前者对负数右移会在最高位补1,后者不会。所以右移操作需要使用无符号的右移,如果使用有符号的右移,会出现无限循环的问题。
public int NumberOf1(int n) {
int count = 0;
while (n != 0) {
if( (n & 1) == 1){
count++;
}
n = n >>> 1;
}
return count;
}
第二种
我们可以将第一种方法反过来,n不动,让1不断的向左移位,与n做与运算。java中int是32位,所以循环次数为32次。
public int NumberOf1(int n) {
int flag = 1;
int count = 0;
while (flag != 0) {
if( (n & flag) != 0 ){
count++;
}
flag = flag << 1;
}
return count;
}
第三种
先来看一个运算。
10 = 1010
10 - 1= 9=1001
1010 & 1001 = 1000
可以得到一个结论,数字n与数字n-1做与运算,会将n最右边的1变为0。即n中有多少个1,就可以进行多少次这样的计算。
public int NumberOf1(int n) {
int count = 0;
while (n != 0) {
count++;
n = (n - 1) & n;
}
return count;
}