解答
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。
本文深入探讨了Java中处理字节流的三种高效算法:直接比较模2与1的方法、利用位操作进行优化的算法以及通过X与(X-1)规律进一步精简的算法。同时,介绍了异或操作在判断两个数差异数量的应用。

689

被折叠的 条评论
为什么被折叠?



