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

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

     -《编程之美》P119原话。

 

       看到这题,我立刻想到了,我之前写的那个博客求1的个数,应该很简单,果断test一下吧。

int func(unsigned char x)
{
	if(x>256) throw "Argument is out of arrange";
  int count=0;
  while(x)
  {
  count++;
  x=x&(x-1);
  }
  return count;
}

结果正确,不过注意要判断一下传入参数的范围,可能溢出,并且如果没有做判断的话,可能对溢出的数据做截断处理,而不会出现运行错误之类的。

方法二:<<编程之美>>上的解法

因为知道数据的范围,为unsiged char 型,我们可以直接对位操作啊。利用移位操作,只不过时间复杂度可能多一点,但是位运算速度快。

代码:

 

int func(unsigned char x)
{
if(x>256) throw "Argument is out of arrange";
   int count=0;
   while(x)
   {
     if(x&(0x01))
	 {
		 count++;
	 }
		 //i++;
		 x>>=1;
   }
return count;
}

当然除2求余跟这个思想差不多。

 

书上还列举了俩个方法:

一个是利用case,枚举完所有的情况,反正只有8个bit嘛。但是这个思想,每次都得判断case的条件。最好的方法是:利用数组枚举完所有的情况,彻底利用空间换时间。数组下标是256中情况,数组存的是1的个数,可以在O(1)内完成。真他妈狠。                       

    原文作者:跑着的程序员
    原文地址: https://blog.csdn.net/A725SASA/article/details/9242821
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞