编程之美:
数字之美:
1:求一个二进制数字中1的个数?例如10101001
方法一:除法 除去2 数字除以二相当于二进制下数字右移一位,查看除以2的余数是否为0可得这位是否为1.循环除,直到数字为0为止
。
int count_1_num(int bn)
{
int num=0;
while(bn){
if(bn%2 == 1){
num++;
}
bn = bn/2;
}
return num;
}
方法二:移位 使数字和0x01进行&操作,获取数字的最后移位是否为1,再数字右移一位,思想和方法一差不多,只是移位操作比除法
操作更加节省时间空间。
int count_1_num(int bn)
{
int num = 0;
while(bn){
num += bn & 0x01;
bn = bn>>0x01;
}
return num;
}
方法三:减法 使数字与本身减一进行&操作,算法思想是每次改变最低位为1的值,例如二进制01010010 - 1 = 01010001 ,与运算一
次去掉一个二进制中的1,直到数字变为0,二进制中的1被全部去掉。
int count_1_num(int bn)
{
int num = 0;
while(bn){
bn & = (bn -1)
num++;
}
return num;
}
方法四:枚举 枚举出所有的可能,switch选择,如果数字比较大,不适合,小数字还行。
方法五:查表法:提前把所有可能计算好填写在表格内,直接获取,空间换时间的方法,时间复杂度仅为o(1).
int coun t Table【256】 ={
0, 1, 1, 2, 1. 2 . 2, 3. 1, 2, 2, 3, 2, 3, 3, 4, 1. 2 . 2, 3. 2, 3, 3, 4, 2, J .
3. 4, 3, 4. 4, 5, 1, 2, 2, J . 2, 3, 3, 4, 2, J. 3. 4, 3, 4, 4, 5. 2, 3. 3,
4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5 . 5, 6. 1, 2, 2 . 3, 2, 3, 3, 4, 2. 3. 3. 4,
3, 4, 4, 5, 2, 3, 3, 4, 3. 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6. 2, 3. 3, 4, 3,
4, 4, 5. 3. 4, 4, 5. 4, 5, 5, 6, 3, 4, 4, 5. 4, 5, 5. 6, 4, 5, 5, 6, 5, 6,
6, 7, L 2 . 2, 3, 2, 3, 3, 4, 2, 3, 3. 4, J . 4, 4, 5, 2, 3, 3, 4, 3 . 4, 4,
5. 3, 4. 4. 5 . 4, 5, 5, 6. 2 . 3. 3, 4, 3 . 4, 4, 5, 3, 4, 4, 5. 4, 5. 5. 6.
3, 4, 4, 5, 4, 5, 5, 6. 4, 5 . 5, 6. 5, 6, 6, 7, 2, 3, 3. 4, 3. 4. 4, 5. 3,
4, 4, 5, 4, 5. 5, 6, J . 4, 4, 5, 4, 5, 5, 6, 4, 5 . 5. 6. 5. 6. 6, 7, 3, 4,
4, 5, 4, 5. 5. 6, 4, 5. 5, 6 . 5, 6, 6, 7, 4, 5 . 5. 6, 5. 6 }
int count_1_num(int bn)
{
return table[bn];
}
通过这些方法主要是想根据自己的需求灵活使用不同的方法,最佳的实现功能,锻炼思维。