回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++源代码 >> 数据结构与算法 C++ >> 计算二进制中 1 的个数
最 近 更 新
阶乘 n! 末尾 0 的个数
计算二进制中 1 的个数推荐
[C++] 斐波那契数列
[源代码] 数据结构与算..
[数据结构 C++]链队列
最 新 推 荐
计算二进制中 1 的个数推荐
热 门 排 行
[数据结构 C++]链队列
[源代码] 数据结构与算..
[C++] 斐波那契数列
计算二进制中 1 的个数推荐
阶乘 n! 末尾 0 的个数
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

计算二进制中 1 的个数


来源:蚂蚁的 C/C++ 标准编程 作者:Antigloss 等级:精品
发布于2007-06-17 14:04 被读1532次 【字体:

    要计算一个整数对应的二进制数有多少位是 1,常用的方法是使用位移:

        #include <climits>  // for CHAR_BIT
        #include <cstddef>  // for size_t

        const std::size_t LONG_BIT = sizeof(long) * CHAR_BIT;

        int nlbits_on(unsigned long n)
        {
            int cnt = 0;
            for (std::size_t i = 0; i != LONG_BIT; ++i)
            {
                cnt += n & 1;
                n >>= 1;
            }
   
            return cnt;
        }

这里,我要介绍的是另外一种方法。请看以下二进制数:

        01110011

这个数一共有 5 个 1。有没有看出什么苗头?没错,将这个数的每一位相加正好是 5。由此可得,算一个字节里 1 的个数的方法如下:

        int nbbits_on(unsigned char n)
        {   // 假设 char 是 8 位的
            n = ((n & 0xAA) >> 1) + (n & 0x55);
            n = ((n & 0xCC) >> 2) + (n & 0x33);
            n = ((n & 0xF0) >> 4) + (n & 0x0F);

            return n;
        }

这个函数第一次将奇数位与偶数位相加。因为每对奇偶位相加的和不会超过“两位”,所以赋值回 n 后,n 的每“两位”保存着前面奇偶位相加的和。然后,再以“两位”为单位进行奇偶相加,结果每“四位”保存着前面相加的和。以此类推,最终算出一个字节里 1 的个数。

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:暂无相关专题

上一篇:[C++] 斐波那契数列
下一篇:阶乘 n! 末尾 0 的个数

共有评论 3 条 网友评分 4分 查看全部评论

游客:错误的;
评分:0
错误的
游客:antigloss
评分:0
请问哪里错误了?
游客:余昌和
评分:5
非常好的算法和实现
值得借鉴

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss