Chinaunix首页 | 论坛 | 博客
  • 博客访问: 141089
  • 博文数量: 30
  • 博客积分: 887
  • 博客等级: 准尉
  • 技术积分: 342
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-03 19:11
文章分类

全部博文(30)

文章存档

2012年(19)

2011年(1)

2010年(6)

2009年(4)

我的朋友

分类: C/C++

2012-02-03 22:52:29

对于一个字(32bit)的数据,求其中“1”的个数,要求算法的执行效率尽可能地高。
方法一:
  1. #define TESTBYTE (0x3200)

  2. int main(int argc, char* argv[])
  3. {
  4.     int i;
  5.     int count = 0;

  6.     for (i=0; i<32; i++)
  7.     {
  8.         if (TESTBYTE & (0x01 << i)) //这里其实可以这样做  if ((TESTBYTE >> i) 0x01)
  9.         {
  10.             count++;
  11.         }
  12.     }

  13.     printf("%d\n", count);
  14.     return 0;
  15. }

方法二:这个方法和uCOS里面任务调度那部分的算法有点相似,将他的可能性全部罗列出来,并用数组来定义,但是这样的情况仅仅局限于bit位数比较低的情况,如8位,如果高达16位,那么就将有65535种情况,也不大合适。

这里仅仅是举bit位数为8的情况。

  1. unsigned char numTable[256] =
  2. {
  3.   0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3,
  4.     3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3,
  5.     4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,
  6.     3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3,
  7.     4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6,
  8.     6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4,
  9.     5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
  10.     3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3,
  11.     4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4,
  12.     4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6,
  13.     7, 6, 7, 7, 8
  14. };


阅读(1772) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~