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

来源:互联网 发布:手机恶意软件排行 编辑:程序博客网 时间:2024/04/30 12:03

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

题目很简单,一般人都可以用最直接的方法求解出来,通过求余和模除运算。对二进制操作过程中,除以一个2,原来的数就会少一个0,如果除过程中余1,则表示当前位置有一个1,计数值加1,代码很简单。但从执行效率来看,这个代码其实也不会很复杂,但有更加简单的方法,作为一个程序员就不应该放弃。我们知道要提高程序的时间运行效率,典型的方法就是以空间换时间。对8位的二进制数,总共的可能输入也只有256个,如果要想得到最优的时间复杂度,只需要把这256个二进制数对应的“1”的个数存入一个数组中,然后直接从这个数组中取就行了。算法的时间复杂度仅为O(1)。但是这个方法对于位数多的二进制数显然不可取。

将算法的时间复杂度降到O(M),其中M是该二进制数的“1”的个数,这样的时间复杂度应该已经是最优的了。我们知道在判断一个二进制数中只有一个“1”的时候,通过判断这个数是否是2的整数次幂得到。例如01000000,如果要得到0,可以和00111111进行与操作。事实上,进行的是01000000&(01000000-00000001)=01000000&00111111=0,所以可以得到下列代码:

                                   int Count(BYTE v){

                                          int num=0;

                                          while(v){

                                                 v&=(v-1);

                                                 num++;

                                          }

                                          returnnum;

                                   }

这个解法对二进制位数多少都是具有很大的时间优势的。

原创粉丝点击