Java代码
public class Solution {
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
/*
本题分治的思想从何而来?
1.对于只有两位的数字 [ab] 只需要交换这两个数字,使得原来a在b前面的情况 -->> b在a前面即可
2.对于只有四位的数字 [abcd]我们需要将原来两个两个的继续交换使得每一个两位数都满足第一个交换后的条件
变成了[badc],然后将每个两位数字看成一个整体,交换他们的顺序[dcba]
然后我们说我们的结论
假设有n位数字,我们要将n位数字颠倒
[前n/2位,后n/2位],颠倒完成之后,后n/2位应该保证在前n/2位的前面,所以将两部分交换
然后对于每一个N/2的部分,他的后面一般区域都应该在前面一半区域的前面,继续交换,直到交换到两个数字
将这两个数字交换完成即可
所以大问题是我们对n位数字颠倒,将他分解为将前 n/2的位置和后n/2的位置互换,并且分治递归解决这个问题。
*/
public int reverseBits(int n) {
n = (n & M1) << 1 | (n >>> 1) & M1;
n = (n & M2) << 2 | (n >>> 2) & M2;
n = (n & M4) << 4 | (n >>> 4) & M4;
n = (n & M8) << 8 | (n >>> 8) & M8;
n = (n >>> 16) | (n << 16);
return n;
}
}