Java中的Integer.bitCount(i)的返回值是i的二进制表示中1的个数。源码如下:

public static int bitCount(int i) {

// HD, Figure 5-2

i = i - ((i >>> 1) & 0x55555555);

i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);

i = (i + (i >>> 4)) & 0x0f0f0f0f;

i = i + (i >>> 8);

i = i + (i >>> 16);

return i & 0x3f;

}

源码解析如下:

public static int bitCount(int i) {

// HD, Figure 5-2

/**

* 每两位为一个单元,把原来单元中1的个数储存在原来的单元中

*/

i = i - ((i >>> 1) & 0x55555555);

/**

*0x33333333其实就是二进制……00110011(共32位),因为上面的每两位代表1的个数,所以下面的这几行就是要把上面每两位

* 的数字加起来,下面的这行代码可以这样理解,每4位分为一组,然后4位中的每两位相加,相加的结果在储存到这4位二进制数中,

* i & 0x33333333表示每4位中的低2位,(i >>> 2) & 0x33333333表示每4位中的高2位,然后在相加

*/

i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);

/**

* 这个更好理解,i >>> 4表示往右移动了4位,然后在与i相加,相当于每8位一组,然后8位中的高4位与低4位相加储存在低4位中,

* 然后这里在与0x0f0f0f0f进行与运算,把高4位完全置为0了,因为0x0f0f0f0f用二进制表示就是00001111000011110000111100001111,

* 看到这里可能有些困惑,这里为什么要与0x0f0f0f0f进行与运算,因为每8位一组的话,最多也就是8,那么4位数足够了,高4位就没有必要了,

* 如果不置为0有没有影响,其实如果1的位数极少的话是没什么影响的,但如果1的位数比较多到后面计算的结果可能就会往前进位,导致结果错误,

* 所以这一步要进行一次与运算,那为什么上面的那行代码没有把4位一组中的高两位置0,这是因为4位一组最多有4个1,而2位二进制数最多表示3,

* 小于4,所以不能置为0,

*

*/

i = (i + (i >>> 4)) & 0x0f0f0f0f;

/**

* 和上面类似,每16位分为一组,每组中的高8位和低8位相加,这里的代码相加的很干净,因为无论是高8位还是低8位中的前4位在上面一行中

* 都已经置为0了,这里也可以像上面那样,加完之后在与0x00ff00ff进行与运算,但其实这里已经没有必要了,因为int类型为32位,

* 最多也就32个1,用8位数储存足够了,所以不会超过8位,也就不用担心超过8位在往前进1位的问题了。

*/

i = i + (i >>> 8);

/**

* 和上面类似,就不在详述

*/

i = i + (i >>> 16);

/**

* 到最后为什么要和0x3f进行与运算,0x3f用二进制表示就是111111,因为上面两行没有进行与运算,所以前面的数据都是无效的,

* 只有最后8位是有效的,而后8位的前两位不用说肯定为0,因为最多也就32个1,用后面6位数表示就已经足够了,所以这里与0x3f

* 进行与运算,来计算出最终1的个数

*/

return i & 0x3f;

}

i=031bi

bitcount java_Java源码解释之Integer.bitCount相关推荐

  1. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  2. Android新的网络请求框架volley源码解释及示例

    最近遇到一个问题:我想用HttpClient来访问网络,发现怎么都无法new出HttpClient的对象,这我就有点摸不着头脑了.记得我之前都是可以使用这个类的,怎么突然间就用不了了.因为不知情,一下 ...

  3. HashMap源码解释

    HashMap 前言: 本文的hashMap是基于jdk1.7的hashMap. 关于jdk1.8的hashMap在另一篇中,那里将会介绍与1.7的差异与优势 首先基础知识介绍: 1.HashMap的 ...

  4. android 实例源码解释,Android Handler 原理分析及实例代码

    Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler的原理 Handler使 ...

  5. zookeeper watch java_Apache ZooKeeper Watcher 机制源码解释

    分布式系统从根本上来说就是不同节点上的进程并发执行,并且相互之间对进程的行为进行协调处理的过程.不同节点上的进程互相协调行为的过程叫做分布式同步.许多分布式系统需要一个进程作为任务的协调者,执行一些其 ...

  6. Vue3 的学习教程汇总、源码解释项目、支持的 UI 组件库、优质实战项目

    大家好,我是你们的 猫哥,一个不喜欢吃鱼.又不喜欢喵 的超级猫 ~ 关于猫哥,大家可以看看我的年终总结 前端工程师的 2020 年终总结 - 3 年之痒. 前言 猫哥是一个常年混迹在 GitHub 上 ...

  7. 【java】线程 ExecutorService 原理 源码 解释

    1.世界 作者: Throwable 转载并且补充: https://www.throwx.cn/2019/07/27/java-concurrency-executor-service/ 1.概述 ...

  8. node koa源码解释

    再次思考:从浏览器输入 URL 到页面展示过程的过程中发生了什么? 通过前面的基础学习,我们了解了基于 Web 的应用基本流程: 通过上图不难发现,无论具体应用功能如何变化, 服务端 处理任务核心三个 ...

  9. observable java_java源码阅读Observable(观察者模式)

    1类签名和简介 packagejava.util;public class Observable Observable是Java内置的观察者模式中的主题类(没错,是类不是接口),和其对应的观察者接口是 ...

最新文章

  1. html jquery ajax乱码问题,jquery使用ajax提交中文乱码问题的解决
  2. Squid 代理服务器 编译源码 伪造HTTP_X_FORWARDED_FOR 请求头
  3. Spring Boot + Mybatis——RowBoundsPlugin造成的[Mapped Statements collection already contains value]解决方案
  4. js setTimeout和setInterval区别
  5. by group 累加中文字段_EF 求和 GroupBy多个字段
  6. sed -i 单引号中嵌套双引号_【函数应用】IF函数的多层嵌套
  7. springboot2 war页面放在那_Spring Boot2版的权限管理系统
  8. windows 域名+虚拟目录 (php)
  9. eclipse配置文件
  10. pands 画图 调整大小_两个精品案例解释机械设计的步骤,有思路,再着手画图...
  11. win7无法打开计算机共享文件夹,win7无法共享文件夹 共享文件设置不了共享怎么办?...
  12. 苹果计算机cpu 型号怎么看,苹果电脑型号怎么看_mac电脑怎么看型号-win7之家
  13. zmap启动报错:[FATAL] get-iface-ip: ioctl failure: No such device
  14. 百度指数对网站优化有什么作用
  15. linux后门rootkit程序介绍
  16. 2022-2028年中国酯基季铵盐行业市场全面调研及投资前景预测报告
  17. 计算机平面设计评分标准,竞赛各专业评分标准.DOC
  18. JspWriter与PrintWriter(转)
  19. echarts设置坐标轴标题的样式
  20. 2018年SEO网络营销新技巧,如何让新网站快速收录与排名

热门文章

  1. Leetcode-45. 跳跃游戏Ⅱ
  2. java this关键字的使用_Java关键字(五)——this
  3. android 自定义控件 焦点,android中设置控件获得焦点
  4. java枚举怎么编译不行的_java – 打开枚举时Maven编译失败
  5. printf打印百分号%
  6. 一维和二维卷积和池化
  7. windows 下 Graphviz 安装及入门教程以及 PlantUML
  8. Effective Java~43. 方法引用优于Lambda
  9. BPP 相关——02
  10. 数据可视化--pyecharts绘图