| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1596 人关注过本帖
标题:如何不用循环统计整数值中 1 的个数
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
已结贴  问题点数:20 回复次数:4 
如何不用循环统计整数值中 1 的个数
比如,整数0x0012中对应的二进制中 1 的个数为 2,
如果不允许使用循环,应该如何实现呢 ?
搜索更多相关主题的帖子: 统计 整数 
2009-10-20 21:57
夜风依旧
Rank: 2
等 级:论坛游民
帖 子:42
专家分:20
注 册:2008-5-13
收藏
得分:10 
貌似不行吧,
要不,,,查表,咋样,
一般是这样做的吧,效率还是比较高的,循环次数就是1的个数
    unsigned x = 0x0012;
    unsigned y = x;
    unsigned cn = 0;
    while(y)
    {
        y &= y - 1;
        cn++;
    }


[b]男人,就要对自己很一点。[/b]
2009-10-20 22:56
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
//怎样快速算出一个二进制32位整数中比特位为1的个数?
 size_t   bit_cnt(unsigned   long   value)   
  {         
                  
  value   =   (value   &   0x55555555)   +   (   (value   >>   1)   &   0x55555555);                  
  value   =   (value   &   0x33333333)   +   (   (value   >>   2)   &   0x33333333);   
  value   =   (value   &   0x0f0f0f0f)   +   (   (value   >>   4)   &   0x0f0f0f0f);                 
  value   =   (value   &   0x00ff00ff)   +   (   (value   >>   8)   &   0x00ff00ff);   
  value   =   (value   &   0x0000ffff)   +   (   (value   >>   16)   &   0x0000ffff);   
        
          return   (size_t)value;   
  }

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2009-10-20 23:06
夜风依旧
Rank: 2
等 级:论坛游民
帖 子:42
专家分:20
注 册:2008-5-13
收藏
得分:10 
觉得查表也是个好办法,比如:
    //c[256]
    unsigned x = 0x0012;
    unsigned char* y = (unsigned char*)&x;
    unsigned cn;
    cn = c[y[0]] + c[y[1]] + c[y[2]] + c[y[3]];

[b]男人,就要对自己很一点。[/b]
2009-10-20 23:10
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
大家看懂 3楼实现的原理了吗?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-07-04 01:46
快速回复:如何不用循环统计整数值中 1 的个数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015954 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved