统计整数n的二进制表示中1的个数
(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的个数相关推荐
- 《剑指offer》-统计整数二进制表示中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...
- 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
转自http://my.oschina.net/ithaibo/blog/142655 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目引自http://ac.jobdu ...
- 整数的二进制表示中 1 的个数
2019独角兽企业重金招聘Python工程师标准>>> 题目:整数的二进制表示中 1 的个数 要求: 输入一个整数,求该整数的二进制表达中有多少个 1. 例如输入 10,由于其二进制 ...
- JAVA实现输入一个整数,输出该数二进制表示中1的个数(《剑指offer》)
题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 这个题目有个比较有意思并且被公认的解法,我就先贴答案吧: public class Solution {public int ...
- 算法--微软面试:整数的二进制表示中1的个数(Java实现)
Q题目 整数的二进制表示中1的个数 输入一个整数,求该整数的二进制表达中有多少个1. 例如,输入10,由于其二进制表示为1010,有两个1,因此输出2. 这是一道很基本的考查位运算的面试题. Answ ...
- 二进制表示中 1 的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 需要注意的是: 右移运算符是将一个二进制数按指定移动的位数向右移动. 移动过程中,正数最高位补0,负数最高位补1,无符号数最 ...
- 题库练习5(句子逆序、字符串排序、int型二进制表示中1的个数、购物单)
1. 句子逆序 将一个英文语句以单词为单位逆序排放.例如"I am a boy",逆序排放后为"boy a am I".所有单词之间用一个空格隔开,语句中除了英 ...
- 计算数值二进制表达式中1的个数
--------------------------------------------- -- 时间:2019-03-21 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...
- BZOJ3209(n的二进制表示中1的个数的乘积)
题目:花神的数论题 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,求 sum(1)至sum(N) 的乘积. #include <iostream> #inc ...
最新文章
- “新一代人工智能”研究的三大重点方向
- 常见挖矿 cpu 算力单位:EH/s 、PH/s、TH/s、Msol/s、Mgps、Kgps
- 初学servlet之使用web.xml配置
- web开发中的 emmet 效率提升工具
- TP5:异常处理封装——3
- 严蔚敏数据结构:链表实现一元多项式相加
- 分布式存储图解_BERT的youxiu变体:ALBERT论文图解介绍
- Python--SQLite学习(10.29)
- SharePoint2010添加webpart找不到内容编辑器
- python编写程序输入球的半径_使用python,我希望绘制一个具有给定半径的3D球形帽...
- 网页端启动服务器控制台程序,在ASP.Net(C#)中调用服务器端的控制台应用程序
- Kylo 0.8.3 安装
- 微信公总测试号的申请+微信网页授权
- centos虚拟机上网慢的问题
- java cxf encoded,java:JAXWS 2.0不支持Rpc / encoded wsdls
- 论文阅读:CVPR 2022 Object Localization under Single Coarse Point Supervision
- 结对项目-数独程序扩展
- 卢克的HTML与CSS基础
- 安装vray显示指定服务器没安装,安装vray是出现“不是有效的win32应用程序”怎么回事?...
- 三维实景地图智慧园区3D可视化物联商迪3D网平台制作
热门文章
- iPhone各版本屏幕尺寸
- java outofmemory 处理_java.lang.OutOfMemoryError处理错误
- stream去重_使用Java Stream API中DistinctBy删除重复数据
- function里面可以写function吗_和田玉不戴的时候,可以长时间泡在水里面吗?
- 坏道修复是不是硬盘东西全部都没有了_硬盘有坏道就不能用了吗?别再吃哑巴亏了,今天跟大家再说一次...
- linux qt显示gif图片,QT显示GIF图片
- 飞行摇杆设置_HORI皇牌空战7最新飞行摇杆抢先开箱 设计出色布局合理
- 文本解析 python 多行,关于python:基于文本的数据格式,支持多行字符串
- 用html5做一个简单网页_用新款ws2812灯带做一个简单的窗花
- python中的with open读取表格文件_python 使用 with open() as 读写文件