highestOneBit()算法解析

来源:互联网 发布:邯郸中国网络菜市场 编辑:程序博客网 时间:2024/04/16 14:58

highestOneBit()算法解析

Integer类有个highestOneBit()方法,作用是返回具有单个 1 位的 int 值, 在指定值中最高位的 1 位的位置,比如5(00000101)返回4(00000100)。

highestOneBit()的算法如下:

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);}

为了书写简单,以一个字节为例,最高位表示符号位,以参数为5为例解释算法:

  1. 第一步:i |= (i >> 1)使i出现1的最高位至多连续2位都为1(包括最高位)
    0000 0101 >>1 = 0000 0010
    0000 0101 | 0000 0010 = 0000 0111
  2. 第二步:i |= (i >> 2),使i出现1的最高位的至多连续4位都为1(包括最高位)
    0000 0111 >>2 = 0000 0001
    0000 0111 | 0000 0001 =0000 0111
  3. 第三步:i |= (i >> 4),使i出现1的最高位的至多连续8位都为1(包括最高位)
    0000 0111 >>4 =0000 0000
    0000 0111 | 0000 0000 =0000 0111
  4. 第四步:i - (i >>> 1),减掉最高位后面的1
    0000 0111 >>>1 =0000 0011
    0000 0111 - 0000 0011 = 0000 0100

对于参数为0或负数的情况推导过程也是类似的。对于负数来说,最后一步的减法要换成补码进行计算。