题目
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.
题目要求是将一个数的位表示进行颠倒,输出颠倒后的数。看到题目第一反应是位运算,但要怎么操作位呢,之前对位操作的题目做的很少,于是重新去学习了一下位运算符的操作后才逐渐找到了方向。
既然要求要反转位,那么我们的最后结果就一位一位的来拿,使原数不断右移,目标数不断左移,每次移动后拿到原数的第一位。
C++代码如下:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t rev_num = 0, index = 32;
while (index--) {
// 目标数左移
rev_num <<= 1;
/*
原数与1相与留下最后一位,
目标数再与其相或拿到最后一位
*/
rev_num |= n & 1;
// 原数右移
n >>= 1;
}
return rev_num;
}
};
刚开始做的时候,循环体的内容是这样的:
rev_num |= n & 1;
rev_num <<= 1;
n >>= 1;
即先相或取最后一位,再来分别移动,这样在运行到只剩下一位时是没有问题的,但到了最后一次取数之后,目的数已经出现了,接下来又走了一次左移,所以导致目的数出错。也希望读者注意一下。
思考后才找到了先移动目的数再取位的方式。