Count bits set in parallel(查找32位整形数中置1的个数)
如果要计算一个整形中的位数有多少位被置位,我们的第一想法就是循环查找。现在我们可以参考:http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
unsigned int bits_counter_v4(unsigned int x) {// count bits of each 2-bit chunkx = x - ((x >> 1) & 0x55555555);// count bits of each 4-bit chunkx = (x & 0x33333333) + ((x >> 2) & 0x33333333);// count bits of each 8-bit chunkx = x + (x >> 4);// mask out junkx &= 0xF0F0F0F;// add all four 8-bit chunksreturn (x * 0x01010101) >> 24; }
利于这个算法,我们只需要12次操作就可以找出int(32)中被置位的个数。接下来我们来分析下这个算法:
1、相邻2位运算得出“1”的个数:
下面是我们希望得到的运算效果:
左边是位数分布(4种分布)|||||右边是个数(0、1、2三种结果) 00b >> unchanged, still 00b 01b >> unchanged, still 01b10b >> must be converted to 01b11b >> must be converted to 10b
接下来给出了可以达到以上效果的算法:首先左移一位,把高位的数给了低位,然后0x55555555是掩码,把高位置0,得到了新的2位数,再用原来的数减去刚刚得到新的两位数,得到我们想要的结果:
00b >> shifted: ?0b >> masked: 00b >> subtraction: 00b - 00b >> 00b 01b >> shifted: ?0b >> masked: 00b >> subtraction: 01b - 00b >> 01b 10b >> shifted: ?1b >> masked: 01b >> subtraction: 10b - 01b >> 01b 11b >> shifted: ?1b >> masked: 01b >> subtraction: 11b - 01b >> 10b
2、相邻4位运算得出“1”的个数:
同理,我们提出期望:
00b and 00b >> 0000b 00b and 01b >> 0001b 00b and 10b >> 0010b 01b and 00b >> 0001b 01b and 01b >> 0010b 01b and 10b >> 0011b 10b and 00b >> 0010b 10b and 01b >> 0011b 10b and 10b >> 0100b
算法:x = (x & 0x33333333) + ((x >> 2) & 0x33333333),在这里我们拿1010b举例,验证结果是否为0100b:
1010b ---->>----- 0010b 0011b 0011b ----&---- ----&---- 0010b 0010b -------------+---------------0100b
3、相邻8位运算得出“1”的个数:
算法:x = x + (x >> 4);x &= 0x0F0F0F0F;
4、乘以0x01010101
如果A, B, C, D代表8位数,那么32为数可以被(
A, B, C, D)表示,乘以0x01010101可以使得(
)32>> (A, B, C, D
A+B+C+D, B+C+D, C+D, D
)32
5、我们左移24位取得我们想要的和。
转载于:https://www.cnblogs.com/wall-e2/p/8952827.html
Count bits set in parallel(查找32位整形数中置1的个数)相关推荐
- 判断32位整数二进制中1的个数
在面试中被问到这一题:判断32位无符号整数二进制中1的个数,虽然不难,但要求层层优化.现在整理一下: 1.基本思路: #include <iostream> using namespace ...
- 32位微型计算机quot;中的32指的是,《计算机应用基础作业一).doc
<计算机应用基础作业一) <计算机应用基础>作业(一) 得分: 一选择题1. 世界上第一台电子数字计算机研制成功的时间是_______年.A.1936 B.1946C.1956 D. ...
- linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...
尝试测试时是否允许访问跨越x86中零边界的内存?在Linux的用户空间中,我编写了一个32位测试程序,该程序试图映射32位虚拟地址空间的低和高页. 之后echo 0 | sudo tee /proc/ ...
- 32位visual studio中添加x64 ActiveX控件方法
visual studio中创建ActiveX控件的方法可参考:https://blog.csdn.net/wangzhiyang925/article/details/38715605?tdsour ...
- 『ACM-算法-二分法』在单调递增序列a中查找小于等于x的数中最大的一个(即x或x的前驱)
写在前面:我们主要还是分享算法的模板,而不是去刨析算法的原理! 定义: 二分答案是指在答案具有单调性的前提下,利用二分的思想枚举答案,将求解问题转化为验证结果. 流程: 首先需要估计答案的上下界,然后 ...
- 给定一个N位数,得到一个N-k位的数中最小的数
题目: 给定一个N位数,例如12345,从里面去掉k个数字,得到一个N-k位的数, 例如去掉2,4,得到135,去掉1,5,得到234.设计算法,求出所有得到的 N-k位数里面最小的那一个 ...
- 64位Fedora运行32位C++程序中int精度溢出处理
在64-bit机器中编译32-bit的代码出现int(强制转换而至)精度溢出: Debug==> error: cast from 'void*' to 'int' loses precisio ...
- mysql linux32_linux 32 位mysql 安装中的问题 以及修改数据库密码
mysql -u root -p 执行该命令时 报错 -bash: mysql: command not found 解决方法 执行 alias mysql=/usr/local/mysql/bin ...
- getlibs_解决32位ubun12.04-linux_mint13中lotus-notes-8.5.3界面不正常问题
安装好lotus notes后参考下面文章的9,10步,下载相应的文件编译. From:http://usablesoftware.wordpress.com/2011/10/10/install-l ...
最新文章
- mvc mvp mvvm的区别与联系_MVC,MVP,MVVM比较以及区别(上)
- Python学习---Django路由系统【all】
- Windows 技术篇-利用telnet方法ping端口通不通实例演示,如何测试服务器端口是否启用,windows启用telnet功能
- Halcon和Opencv的区别?
- 在既有系统中打通Apache Ignite、MySQL和Node.js
- oracle 客户端 for mips,盒子里的世界: MIPS虚拟机(zt)
- 王思聪又双被限制消费了!
- 计算机教案解说词,小学微机室解说词初稿
- .Net将Base64字符串转换为Image对象或保存为图片到本地
- java基于springboot高校后勤报修管理系统
- Acrobat DC安装教程
- c语言单片机编程教学大纲,单片机应用技术[C语言]教学大纲.doc
- 电子元器件之电容-2
- Go的goroutine
- 【JavaScript】制作日历
- php 微信公众号自定义菜单栏,php实现微信公众号创建自定义菜单
- 【WebLogic使用】1.WebLogic的下载与安装
- javaweb课程设计网上书店
- android 11及以上保存图片视频到相册
- 如何设置路由器并利用路由器+宽带猫实现单机或是多机共享自动拨号上网
热门文章
- 【笔记】微信小程序基础
- 系统架构师(四)计算机网络
- 共享文件夹服务器内存资源不足,『excel文件打开就提示可用资源不足,无法完成此任务』共享文件夹怎么设置...
- 利用计算机实现对个别学习者,利用计算机实现对学习者进行个别指导的教学模式是基于( )理论。...
- 电路图部分原件的画法
- 动态内表的俩栗子_SAP刘梦_新浪博客
- 原来PID是在老王头和老斯基的斗争中诞生的
- Windows Server 2016修改Administrator的密码
- 2021年,让你看透世界的8个底层逻辑
- win10下如何配置JAVA环境