(1)逐位判断(位运算)

int counter_ones(unsigned n)
{
int counter = 0;
While (n) {
counter += n&1;
n >>=1;
}

return counter;
}

(2)一个整型不为0,那么二进制表示时,至少包含一位1。如果整数减去1,那么最右边的1变成0,而该1后面的0变成1,其余位不变。将原来的整数和减去1后的数做与运算,从原来最右边的那个1开始所有的,所有位变成0,如:1100&(1100-1=1011)=1000。也就是说整数与该数-1后做与运算,会把最右边一个1变成0。

int counter_ones(unsigned n)
{
int counter = 0;
While (n) {
counter++;
n &= (n-1);
}

return counter;
}

(3)查表法

将32位(64位)整型数分切割成n个区间,每个区间位长位8。分别统计每个位区间中1个个数,然后相加。
static const unsigned char BitsSetTable256[256] = 
{
#   define B2(n) n,     n+1,     n+1,     n+2
#   define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
#   define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
    B6(0), B6(1), B6(1), B6(2)
};

int counter_ones(unsigned n)
{
int counter = 0;
for (; n > 0; n >> 8) {
counter += BitsSetTable256[n&255];
}

return counter;
}

Or

int counter_ones(unsigned n)
{
         char *p = (char *)&n;
         return BitsSetTable256[*p] + BitsSetTable256[*(p+1)] + BitsSetTable256[*(p+2)] + BitsSetTable256[*(p+3)]
}

(4)归并法。
对于一个32位整数,先分成16组,每组2位,统计其中1个数,然后将统计的结果两两合并,得到8组,然后再此基础上,合并得到4,2,1,最总得到结果。

int counter_ones(unsigned n)
{
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);

return n;

}

参考:http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive

统计整数n的二进制表示中1的个数相关推荐

  1. 《剑指offer》-统计整数二进制表示中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...

  2. 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示

    转自http://my.oschina.net/ithaibo/blog/142655 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目引自http://ac.jobdu ...

  3. 整数的二进制表示中 1 的个数

    2019独角兽企业重金招聘Python工程师标准>>> 题目:整数的二进制表示中 1 的个数 要求: 输入一个整数,求该整数的二进制表达中有多少个 1. 例如输入 10,由于其二进制 ...

  4. JAVA实现输入一个整数,输出该数二进制表示中1的个数(《剑指offer》)

    题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 这个题目有个比较有意思并且被公认的解法,我就先贴答案吧: public class Solution {public int ...

  5. 算法--微软面试:整数的二进制表示中1的个数(Java实现)

    Q题目 整数的二进制表示中1的个数 输入一个整数,求该整数的二进制表达中有多少个1. 例如,输入10,由于其二进制表示为1010,有两个1,因此输出2. 这是一道很基本的考查位运算的面试题. Answ ...

  6. 二进制表示中 1 的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 需要注意的是: 右移运算符是将一个二进制数按指定移动的位数向右移动. 移动过程中,正数最高位补0,负数最高位补1,无符号数最 ...

  7. 题库练习5(句子逆序、字符串排序、int型二进制表示中1的个数、购物单)

    1. 句子逆序 将一个英文语句以单词为单位逆序排放.例如"I am a boy",逆序排放后为"boy a am I".所有单词之间用一个空格隔开,语句中除了英 ...

  8. 计算数值二进制表达式中1的个数

    --------------------------------------------- -- 时间:2019-03-21 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  9. BZOJ3209(n的二进制表示中1的个数的乘积)

    题目:花神的数论题 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,求 sum(1)至sum(N) 的乘积. #include <iostream> #inc ...

最新文章

  1. “新一代人工智能”研究的三大重点方向
  2. 常见挖矿 cpu 算力单位:EH/s 、PH/s、TH/s、Msol/s、Mgps、Kgps
  3. 初学servlet之使用web.xml配置
  4. web开发中的 emmet 效率提升工具
  5. TP5:异常处理封装——3
  6. 严蔚敏数据结构:链表实现一元多项式相加
  7. 分布式存储图解_BERT的youxiu变体:ALBERT论文图解介绍
  8. Python--SQLite学习(10.29)
  9. SharePoint2010添加webpart找不到内容编辑器
  10. python编写程序输入球的半径_使用python,我希望绘制一个具有给定半径的3D球形帽...
  11. 网页端启动服务器控制台程序,在ASP.Net(C#)中调用服务器端的控制台应用程序
  12. Kylo 0.8.3 安装
  13. 微信公总测试号的申请+微信网页授权
  14. centos虚拟机上网慢的问题
  15. java cxf encoded,java:JAXWS 2.0不支持Rpc / encoded wsdls
  16. 论文阅读:CVPR 2022 Object Localization under Single Coarse Point Supervision
  17. 结对项目-数独程序扩展
  18. 卢克的HTML与CSS基础
  19. 安装vray显示指定服务器没安装,安装vray是出现“不是有效的win32应用程序”怎么回事?...
  20. 三维实景地图智慧园区3D可视化物联商迪3D网平台制作

热门文章

  1. iPhone各版本屏幕尺寸
  2. java outofmemory 处理_java.lang.OutOfMemoryError处理错误
  3. stream去重_使用Java Stream API中DistinctBy删除重复数据
  4. function里面可以写function吗_和田玉不戴的时候,可以长时间泡在水里面吗?
  5. 坏道修复是不是硬盘东西全部都没有了_硬盘有坏道就不能用了吗?别再吃哑巴亏了,今天跟大家再说一次...
  6. linux qt显示gif图片,QT显示GIF图片
  7. 飞行摇杆设置_HORI皇牌空战7最新飞行摇杆抢先开箱 设计出色布局合理
  8. 文本解析 python 多行,关于python:基于文本的数据格式,支持多行字符串
  9. 用html5做一个简单网页_用新款ws2812灯带做一个简单的窗花
  10. python中的with open读取表格文件_python 使用 with open() as 读写文件