有趣的位运算 - 翻转整数位
最直接的想法可能是这样:
public static int reverse(int num){int result = 0;for(int i=0; i<32; ++i){if((num & (1<<i))>0)result |= 1<<(31-i);}return result;}
public static int reverse(int i) { // HD, Figure 7-1 i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;//交换相邻的两个位 i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;//交换相邻的两个两位 i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f; //交换相邻的两个四位 i = (i & 0x00ff00ff) << 8 | (i >>> 8) & 0x00ff00ff;//交换相邻的两个八位 i = (i & 0x0000ffff) << 16 | (i >>> 16) & 0x0000ffff;//交换相邻的两个十六位 return i; }
public static int reverse(int i) { // HD, Figure 7-1 i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555; i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333; i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f; i = (i << 24) | ((i & 0xff00) << 8) | ((i >>> 8) & 0xff00) | (i >>> 24); return i; }