先了解一下位运算的知识:
与&:0&0=0 0&1=0 1&0=0 1&1=1
或|:0|0=0 0|1=1 1|0=1 1|1=1
异或^:0^0=0 0^1=1 1^0=1 1^1=0
取反~:~1=0 ~0=1
左移<<:左边的二进制位丢弃,右边补0
右移>>:正数左补0,负数左补1,右边丢弃
无符号左移<<<:左边的二进制位丢弃,右边补0
无符号右移>>>:忽略符号位,空位都以0补齐
逐位颠倒
public static int reverseBits(int n) {
int rev = 0;
for (int i = 0; i < 32 && n != 0; ++i) {
rev |= (n & 1) << (31 - i);
n >>>= 1;
}
return rev;
}
位运算分治
private static final int M1 = 0x55555555; // 01010101010101010101010101010101
private static final int M2 = 0x33333333; // 00110011001100110011001100110011
private static final int M4 = 0x0f0f0f0f; // 00001111000011110000111100001111
private static final int M8 = 0x00ff00ff; // 00000000111111110000000011111111
public int reverseBits(int n) {
n = n >>> 1 & M1 | (n & M1) << 1;
n = n >>> 2 & M2 | (n & M2) << 2;
n = n >>> 4 & M4 | (n & M4) << 4;
n = n >>> 8 & M8 | (n & M8) << 8;
return n >>> 16 | n << 16;
}
如有错误欢迎指正