public static int highestOneBit(int i) {// 对于其1最高位n,便于理解咱们从左到右为顺序递增 // HD, Figure 3-1 i |= (i >> 1);// n 到 n+1 都是 1(n开始2位) i |= (i >> 2);// n 到 n+3(n开始4位) i |= (i >> 4);// n n+7(n开始8位) i |= (i >> 8);// n n+15(n开始16位) i |= (i >> 16);// n n+31(n开始32位) return i - (i >>> 1);// 只保留最高位 }
public static int lowestOneBit(int i) { // HD, Section 2-1 return i & -i;// i&(i的反码)=0,只需证明 i的反码+1 后一直加到i的最低位即可:应该不难理解,一直+1,如果之前是0那么就往前+1,遇到0则表明之前就是1. } i & (i-1)// 为减去最低位1后的i