1.问题描述
Reverse bits of a given 32 bits unsigned integer.
Example:
Input: 43261596 Output: 964176192 Explanation: 43261596 represented in binary as 00000010100101000001111010011100, return 964176192 represented in binary as 00111001011110000010100101000000.
Follow up:
If this function is called many times, how would you optimize it?
2.算法分析
2.1 移位运算
给定的是无符号型,所以不用考虑负数的情况,可以把原二进制数与1进行按位与操作,然后依次右移一位,逐次取出每一位,然后初始化一个32位的返回值res为0,与从原二进制数取出来的每一位进行按位或运算,或者相加,再把res左移一位,以便跟下一位进行或运算。
2.2 利用“归并排序”的思想分段
假设有一个输入为:0123 4567 89AB CDEF,
希望反转之后得到:FEDC BA98 7654 3210
1)相邻两个各自交换后:1032 5476 98BA DCFE
2)相邻4个两两交换后: 3210 7654 BA98 FEDC
3)相邻8个四四交换后: 7654 3210 FEDC BA98
4)相邻16个八八交换后:FEDC BA98 7654 3210
同理,对于32位的二进制,可以经过1,2,4,8,16位的交换以后实现。
3.代码实现
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = 0;
for(int i = 0; i<32; i++){
//与1进行按位与,相当于取出最后一位
uint32_t tmp = n & 1;
//右移一位,等着下一循环取出右边起第二位
n >>= 1;
//结果每次左移一位,然后与取出来的一位进行按位或操作
res <<= 1 ;
res |= tmp;
}
return res;
}
};