题目链接在此
Reverse bits of a given 32 bits unsigned integer.
For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as00111001011110000010100101000000).
把一个unsigned int 的二进制倒过来,输出对应的十进制。需要注意的是在翻转的时候,原数的前导0也要算在内。
用栈咯:
public:
uint32_t reverseBits(uint32_t n) {
stack<uint32_t> s;
while (n != 0) {
s.push(n % 2);
n /= 2;
}
while (s.size() < 32) {
s.push(0);
}
uint32_t sum = 0;
uint32_t power = 1;
while (!s.empty()) {
sum += s.top() * power;
power += power; // power *= 2
s.pop();
}
return sum;
}
};
Follow up :
If this function is called many times, how would you optimize it?
要求优化时间。这种题要优化的话,位运算是常见套路。
查了一下,官方题解是这种做法:
class Solution2 {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t answer = 0;
for (int i = 1; i <= 32; i++) {
answer <<= 1;
if (n & 1)
answer |= 1;
n >>= 1;
}
return answer;
}
};
值得一提的是,当不知道unsigned int在机器上具体是多少位的时候,可以用这种方法来处理:
for (uint32_t i = 1; i != 0; i <<= 1) { …… }
即把一个unsigned int 数字1一直左移,直到它变成全0的时候,也就得到了该机器内unsigned int的长度