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

来源:互联网 发布:网络直播打赏 编辑:程序博客网 时间:2024/05/18 20:07

书中的题目是:求一个字节(无符号)中1的个数。总共给出了五种方法。

解法一:利用除法和求模运算。计算机中的求模运算比较耗时。

template <typename T>int Count(T v){int num = 0;while (v){if (v % 2 == 1){++num;}v /= 2;}return num;}


解法二:利用位运算。时间复杂度是O(lgv)。

template <typename T>int Count1(T v){int num = 0;while (v){if (v &(0x01 << (sizeof(v) << 2 -1))){++num;}v = v << 1;}return num;}


解法三:利用  v & (v-1)  会将v的二进制中最右边为1的位 变为0 。假设一的位数为N,时间复杂度为O(N)

template <typename T>int Count2(T v){int num = 0;while (v){++num;v &= (v - 1);}return num;}

解法四:利用分支操作。

解法五:利用表查找。

 int countTable[256] = { 0, 1, 1, 2, 1, ..., 7, 7, 8 };           int Count(int v) {        return countTable[v];    }


解法五 时间复杂度为:O(1),但是空间复杂度高。是典型的空间换取时间。只有在位数比较小的情况下适用。


另外:这边博客还分析了另外的几个解法(针对具体的应用,时间会更快),有兴趣的可以参考一下。

http://blog.csdn.net/justpub/article/details/2292823

0 0
原创粉丝点击