问题
将一个二进制数反转
如:
Input: 00000010100101000001111010011100
Output: 00111001011110000010100101000000
解决方案
可以预设一些反转结果,如四位数的反转结果可以写作如下数组
char nums[16] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
设L表示预设的反转结果的位数,接着从低位开始每次提取L位并通过预设数组得到反转结果后再放入高位
这样对于长度为n的数字,该问题的复杂度等于n/L
以下为参考代码
public static long reverseBits(long x) {
final int L = 16;
final int BIT.MASK = OxFFFF;
return precomputedReverse[(int)(x & BIT_MASK)] « (3 * L)
| precomputedReverse[(int)((x >>> L) & BIT_MASK)] « (2 * L)
| precomputedReverse[(int)((x >>> (2 * L)) & BIT_MASK)] « L
| precomputedReverse[(int)((x >>> (3 * L)) & BIT_MASK)];
}