博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Integer的highestOneBit方法
阅读量:7049 次
发布时间:2019-06-28

本文共 1049 字,大约阅读时间需要 3 分钟。

  • 方法用意
public static int highestOneBit(int i) {        // HD, Figure 3-1        i |= (i >>  1);        i |= (i >>  2);        i |= (i >>  4);        i |= (i >>  8);        i |= (i >> 16);        return i - (i >>> 1);    }

  如果i为负数,则统一返回-231 = -2147483648

  如果i=0,则统一返回0

  如果i为正数,则返回i二进制表示的最高位为最高位,其余右边都补0的一个数。例如 i = 3 ,二进制是 0011,则返回的结果是 0010 = 2

  • 算法过程解密

  假设 i = 17,二进制表示为 00000000 00000000 00000000 00010001 

  第一步,i |= (i >> 1) 计算过程

  

  此时 i = 24 ,二进制表示为 00000000 00000000 00000000 00011000 

  第二步,i |= (i >> 2) 计算过程

  

  此时i = 30,二进制表示为 00000000 00000000 00000000 00011110 

  第三步,i |= (i >> 4)计算过程

  此时 i = 31,二进制表示为 00000000 00000000 00000000 00011111。这个时候就把原 i = 17 的最高位(第5位)开始都填充为1,这样第4步和第5步就都不会改变i的值了。

  执行到(i - (i >>> 1))之前 i一直为31。

  最后一步,i - (i >>> 1)计算过程

  

  最后的结果是i = 16 

  • 总结
  1. 此方法的算法设计很精妙,性能非常高。
  2. 整数的最大数是01111111 11111111 11111111 11111111,所以要经过上面1+2+4+8+16=31位的移动,才能确保取到从左边数31位的数字。
  3. 负整数的首位,也即是符号位是1,经过i - (i >>> 1)计算,也就能得到最小的负整数10000000 00000000 00000000 00000000,所以负数执行此方法统一得到的值是-2147483648。

  

转载于:https://www.cnblogs.com/goalone/p/9469935.html

你可能感兴趣的文章
[Android学习笔记]使用getIdentifier()获取资源Id
查看>>
Vim与Python真乃天作之合
查看>>
阅读《移山之道》及讲义感想
查看>>
css3实现好看的边框效果
查看>>
Difference Between 2 Dates or 2 Times
查看>>
python练习-简单小爬虫
查看>>
python进阶-面向对象编程五:类的内置方法
查看>>
JAVA入门到精通-第52讲-面试题讲评
查看>>
springboot的热部署和dubug
查看>>
第一次写博客
查看>>
java 桌面程序打包 EXE4J
查看>>
05-spark streaming & kafka
查看>>
python杂记
查看>>
Touch基本
查看>>
【uva】1220 Party at Hali-Bula
查看>>
cd 简化命令
查看>>
《JAVA NIO》Channel
查看>>
实验6
查看>>
今日练习
查看>>
学习的快乐
查看>>