leetcode#190 颠倒二进制位
题目:
颠倒给定的 32 位无符号整数的二进制位。
示例:
输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
思路:
1、用ans=0,ans*10+nums[i]逐渐接受每一位。
2、位分治
反转整个二进制,相当于把这个二进制分成左右两部分,然后把这两部分互换就可以了。
对于左右两部分的内部,我们递归的进行相同的互换。
直至最后一步互换奇偶位。
代码:
class Solution
{
public:
const uint32_t M1 = 0x55555555; // 01010101010101010101010101010101
const uint32_t M2 = 0x33333333; // 00110011001100110011001100110011
const uint32_t M4 = 0x0f0f0f0f; // 00001111000011110000111100001111
const uint32_t M8 = 0x00ff00ff; // 00000000111111110000000011111111
uint32_t reverseBits(uint32_t n)
{
n = n >> 1 & M1 | (n & M1) << 1;
n = n >> 2 & M2 | (n & M2) << 2;
n = n >> 4 & M4 | (n & M4) << 4;
n = n >> 8 & M8 | (n & M8) << 8;
return n << 16 | n >> 16;
}
};