如果要计算一个整形中的位数有多少位被置位,我们的第一想法就是循环查找。现在我们可以参考: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可以使得(A, B, C, D32>> (A+B+C+D, B+C+D, C+D, D32

5、我们左移24位取得我们想要的和。

转载于:https://www.cnblogs.com/wall-e2/p/8952827.html

Count bits set in parallel(查找32位整形数中置1的个数)相关推荐

  1. 判断32位整数二进制中1的个数

    在面试中被问到这一题:判断32位无符号整数二进制中1的个数,虽然不难,但要求层层优化.现在整理一下: 1.基本思路: #include <iostream> using namespace ...

  2. 32位微型计算机quot;中的32指的是,《计算机应用基础作业一).doc

    <计算机应用基础作业一) <计算机应用基础>作业(一) 得分: 一选择题1. 世界上第一台电子数字计算机研制成功的时间是_______年.A.1936 B.1946C.1956 D. ...

  3. linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...

    尝试测试时是否允许访问跨越x86中零边界的内存?在Linux的用户空间中,我编写了一个32位测试程序,该程序试图映射32位虚拟地址空间的低和高页. 之后echo 0 | sudo tee /proc/ ...

  4. 32位visual studio中添加x64 ActiveX控件方法

    visual studio中创建ActiveX控件的方法可参考:https://blog.csdn.net/wangzhiyang925/article/details/38715605?tdsour ...

  5. 『ACM-算法-二分法』在单调递增序列a中查找小于等于x的数中最大的一个(即x或x的前驱)

    写在前面:我们主要还是分享算法的模板,而不是去刨析算法的原理! 定义: 二分答案是指在答案具有单调性的前提下,利用二分的思想枚举答案,将求解问题转化为验证结果. 流程: 首先需要估计答案的上下界,然后 ...

  6. 给定一个N位数,得到一个N-k位的数中最小的数

    题目: 给定一个N位数,例如12345,从里面去掉k个数字,得到一个N-k位的数,    例如去掉2,4,得到135,去掉1,5,得到234.设计算法,求出所有得到的    N-k位数里面最小的那一个 ...

  7. 64位Fedora运行32位C++程序中int精度溢出处理

    在64-bit机器中编译32-bit的代码出现int(强制转换而至)精度溢出: Debug==> error: cast from 'void*' to 'int' loses precisio ...

  8. mysql linux32_linux 32 位mysql 安装中的问题 以及修改数据库密码

    mysql -u root -p  执行该命令时 报错 -bash: mysql: command not found 解决方法 执行 alias mysql=/usr/local/mysql/bin ...

  9. 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 ...

最新文章

  1. mvc mvp mvvm的区别与联系_MVC,MVP,MVVM比较以及区别(上)
  2. Python学习---Django路由系统【all】
  3. Windows 技术篇-利用telnet方法ping端口通不通实例演示,如何测试服务器端口是否启用,windows启用telnet功能
  4. Halcon和Opencv的区别?
  5. 在既有系统中打通Apache Ignite、MySQL和Node.js
  6. oracle 客户端 for mips,盒子里的世界: MIPS虚拟机(zt)
  7. 王思聪又双被限制消费了!
  8. 计算机教案解说词,小学微机室解说词初稿
  9. .Net将Base64字符串转换为Image对象或保存为图片到本地
  10. java基于springboot高校后勤报修管理系统
  11. Acrobat DC安装教程
  12. c语言单片机编程教学大纲,单片机应用技术[C语言]教学大纲.doc
  13. 电子元器件之电容-2
  14. Go的goroutine
  15. 【JavaScript】制作日历
  16. php 微信公众号自定义菜单栏,php实现微信公众号创建自定义菜单
  17. 【WebLogic使用】1.WebLogic的下载与安装
  18. javaweb课程设计网上书店
  19. android 11及以上保存图片视频到相册
  20. 如何设置路由器并利用路由器+宽带猫实现单机或是多机共享自动拨号上网

热门文章

  1. 【笔记】微信小程序基础
  2. 系统架构师(四)计算机网络
  3. 共享文件夹服务器内存资源不足,『excel文件打开就提示可用资源不足,无法完成此任务』共享文件夹怎么设置...
  4. 利用计算机实现对个别学习者,利用计算机实现对学习者进行个别指导的教学模式是基于( )理论。...
  5. 电路图部分原件的画法
  6. 动态内表的俩栗子_SAP刘梦_新浪博客
  7. 原来PID是在老王头和老斯基的斗争中诞生的
  8. Windows Server 2016修改Administrator的密码
  9. 2021年,让你看透世界的8个底层逻辑
  10. win10下如何配置JAVA环境