解答
1 直接考虑每位模2 和1比
public static int method1(byte input){
int ans = 0;
while(input !=0){
if(input %2 !=0){
ans ++;
}
input/=2;
}
return ans;
}
2 考虑用位来操作,直接使用右移和0x01与。
2.1 注意移位的写法。java对byte的数学操作都会先转换成int。所以强制转换,右移也要用无符号的,并且计算前先要和0xff与,表示作为int前三字节设为0
public static int method2(byte input){
int ans =0;
while(input!=0){
ans += input & 0x01;
input =(byte)((input&0xff)>>>1);
}
return ans;
}
3 注意到X&(X-1)的规律。
public static int method3(byte input){
int ans =0;
while(input!=0){
input = (byte)(input&(input-1));
ans++;
}
return ans;
}
4 用空间换时间的算法,要么case,要么数组或者hash表。
拓展题
2 A异或B,得到数C有几个1就代表有几位不同,剩下的就是计算C有几位1。