1.每一位都与0x1做&运算,计算结果是否为1
原理:
&与运算:只有两个二进制数对应位置都为1时才为1
如111&111=111 , 111&101=101,1111&0001=1
java代码:
public static int getCount(int num) {
int count = 0;
while ( num !=0) {
if( num & 1==1 ){
++count;
}
num >>= 1; //向右移位
}
return count;
}
2. 通过使用每次将二进制中1的个数减少一个的方式,知道全部为0
原理:
num-1转换为二进制即为将二进制最后一个1及其后面的每一位取反
如:100110-1=100101 ,1111000-1=1110111
然后计算num&(num-1),此操作每次将二进制数中的1的个数减少1个
如:111&(110)=110,111000&(111000-1)=111000&110111=110000
java代码:
public static int getCount(int num) {
int count = 0;
while ( num !=0) {
//每次减少一位1
num &= (num - 1) ;
++count;
}
return count;
}
3.将十进制转换为二进制
原理:
将十进制采用辗转相除取余,计算出二进制表示,然后判断每一位是否为1
该方式浪费空间,效率较低,不建议使用