二进制中的1的个数(剑指offer)
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法1:将该数与temp(temp起始为1)进行与运算(就是最低位与1与)结果不为0,则该位为1;结果为0,则该位为0;temp进行左移一位,进而判断该数的下一位;直到判断完该数的所有位即temp左移至结果为0的时候结束。
public class Solution {
public int NumberOf1(int n) {
int temp = 1;
int count = 0;
while(temp!=0){
if((temp&n)!=0){
count++;
}
temp = temp<<1;
}
return count;
}
}
解法2:一个数与比该数的小1的数进行与运算得出的数就会使该数最低为1的位变为0,故可以通过此来进行处理,就n每次等于n&(n-1),与一次少一个1,直到n=0的时候就把所有的1变为0,通过此来计数,与一次count加一次
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!=0){
count++;
n = n&(n-1);
}
return count;
}
}