计算整数的二进制表示中1的个数
算法一:(最容易想到)
最容易想到的算法是用1进行移位与运算 如7的二进制表示为0111 用二进制 标志flag=0001 与7= 0111 运算判断最右边第一位为1 则计数加一,把flag左移一位为0010 与7= 0111进行与运算判断 7=0111 的二进制表示的倒数第二位为1,则计数加一 ,如此类推 当flag左移到为0时 则可计算出 7 = 0111 有3个1.
//通过移位来计算 整数的二进制表示中有多少个1
public static int numberOf1(int n){
int count = 0;
int flag = 1;
while(0 != flag){
if(0 != (n & flag))
count++;
flag = flag << 1;
}
return count;
}
算法二:利用 n & (n-1) 会把 n 的最右边的1清零
例如:6 = 0110 ;6 & (6-1)= 0100此算法要比算法一更快,因为对于int型的整数来说 会循环32次;而算法二有多少个1就会循环多少次
对于需要计算整数的二进制有多少个1都可以用算法二计算(把最右边的1变成0;也可用于解决其他类似的问题),不多说 上代码更直观
//通过 n&(n-1) , n&(n-1)会把该整数最右边一个1变成0 计算 整数的二进制表示中有多少个1
public static int numberOf2(int n){
int count = 0;
while(0 != n){
count++;
n = n & (n-1);
}
return count;
}