编程之美-2.1-二进制数中1的个数

1. 简述

    对一个字节(8bit)的无符号整型变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能的高。

2. 思路

    我对这道题没有什么新的发现,也就是再说一遍编程之美上面的解答思路。第一个思路就是一个位一个位的判断,8位的数字,就是8次。第二个思路就是每次消减数字二进制中的最后一个1,直到数字变为0为止,这个方法仅与数字的二进制中的1的个数有关,因此比第一个思路的复杂度更好一点,每次消减最后一个1的方法为num = num & (num-1)。

3. 代码   

#include <iostream>
using namespace std;

unsigned char find_num_method_1(char num) {
unsigned char count = 0;
for(int i=0; i<8; i++) {
count += num & 0x01;
num >>= 1;
}
return count;
}
unsigned char find_num_method_2(char num) {
unsigned char count = 0;
while(num > 0) {
count++;
num = num & (num-1);
}
return count;
}

int main() {
char num;
cin >> num;
cout << (int)find_num_method_1(num) << endl;
cout << (int)find_num_method_2(num) << endl;
system("PAUSE");
return 0;
}

    输出结果为:

   

4. 扩展问题

    第一个扩展:如果变量是32位的DWORD,你会使用哪一种方法,或者改进哪一个方法?
    第二个扩展:给出两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位?也就是问A和B的二进制表示中有多少位是不同的?
    对于第一个扩展,打表是肯定不行了,32位的DWORD打表需要2^32(即4G)个数字,每个数字一个字节,一共就要4GB。不过使用第三节中提到的两个方法都没问题的,最大的才32次。
    对于第二个扩展,就是将A与B异或,然后求这个异或的结果中1的个数即可。

5. 参考

    编程之美,2.1节,求二进制中1的个数。

posted @ 2011-09-23 16:51  xiaodongrush  阅读(986)  评论(1编辑  收藏  举报