查看源码时偶然看到
Integer.highestOneBit(int i);
其中源码为
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=1001 1110 1000 0001
i |= (i >> 1)–>i=1101 1111 1100 0001
i |= (i >> 2)–>i=1111 1111 1111 0001
i |= (i >> 4)–>i=1111 1111 1111 1111;
发现规律: 仅关注最改为highestBit为1,则i |= ( i >> 1)操作后最高位后1为变为1,即1100 0000 0000 0000;右移2,4,8,16位后,则从最高位开始全部为1。
i - i >>> 1,即取最高为。
故该方法是取一个int值的二进制的最高位。