编程之美--2.1 求二进制数中1的个数
2014-08-11 22:36
267 查看
解答
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。
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。
相关文章推荐
- [编程之美] 2.1 求二进制数中1的个数
- 编程之美 2.1 求二进制数中1的个数
- 【编程之美】2.1 二进制数中1的个数
- 编程之美 2.1求二进制数中1的个数
- 读书笔记之编程之美 - 2.1 求二进制数中1的个数
- 编程之美-2.1、求二进制数中1的个数
- 编程之美-2.1-求二进制数中1的个数
- 编程之美-2.1-二进制数中1的个数
- 【编程之美】2.1 - 求二进制数中1的个数
- 编程之美 2.1 求二进制数中1的个数
- Python的socket网络编程2.1
- 编程之美--BYTE二进制数中1的个数
- 编程之美读书笔记2.1—求二进制数中1的个数
- Java编程思想-第二章-一切都是对象-2.1-2.2笔记
- 算法导论2.1-4——n个二进制数相加
- 我与python约个会:30.1. 企业级开发进阶2.1:TCP编程
- 编程之美---求二进制数中1的个数
- 编程之美---求二进制数中1的个数
- 重新开始战斗08-编程之美-求二进制数中1的个数
- 编程之美2.1 求二进制数中1的个数