Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4478
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 27
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-20 20:33
文章分类

全部博文(2)

文章存档

2014年(2)

我的朋友

分类: C/C++

2014-02-20 22:05:31

以下提供两种方法:
方法1:位操作,循环右移

点击(此处)折叠或打开

  1. int Count(unsigned char n){
  2.     int count = 0;
  3.     while( n )
  4.     {
  5.         count += n&1;
  6.         n >>= 1;
  7.     }
  8.     return count;
  9. }

这个方法的效率和位于最左面1的位置有关,比如01000000,需要循环7次,时间复杂度是O(log2n)

方法二:
从上面的方法我们可以发现前6次循环其实是多余的,如何使得我们执行效率直接与1的个数相关。

利用 n &= (n-1),直到n为0,这样的循环次数只和1的个数有关。
比如  10001000,用上面的式子每次可以识别出最右边的那个1
     10001000 & 10000111 = 10000000这样最右边的1就被过滤掉了
     10000000 & 01111111 = 00000000循环直接结束,1的个数也统计出来了

点击(此处)折叠或打开

  1. int Count(unsigned char n){
  2.     int count = 0;
  3.     while( n )
  4.     {
  5.         n &= (n - 1);
  6.         count++;
  7.     }
  8.     return count;
  9. }


阅读(224) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:关于ifconfig down与ifdown

给主人留下些什么吧!~~

啦哆A梦2014-02-21 11:03:37