190. 颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。
方法一
将二进制数按位逆序输入到另一个二进制数中。
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t num = n; //源二进制数
uint32_t res = 0; //目标二进制数
for(int i = 0; i < 32; i++){ //逆序输入
res <<= 1; //目标二进制数左移
res += num%2; //按位放入目标二进制数
num >>= 1; //源二进制数右移
}
return res;
}
};
方法二
连续换位。
这个方法比较好的是巧妙的运用了数运算的与和或进行“位选择”再组装。试用&(与)进行二进制位选择,再试用 | (或)进行组装。
public class Solution {
public uint32_t reverseBits(int n) {
uint32_t res = n;
// 交换前后16位
res = (res >> 16) | (res << 16);
// 在每个16位中再交换8位
res = ((res & 0xff00ff00) >> 8) | ((res & 0x00ff00ff) << 8);
// 在每个8位中再交换4位
res = ((res & 0xf0f0f0f0) >> 4) | ((res & 0x0f0f0f0f) << 4);
// ... 1100110011001100... 0011001100110011...
res = ((res & 0xcccccccc) >> 2) | ((res & 0x33333333) << 2);
// 1010101010101010... 0101010101010101...
res = ((res & 0xaaaaaaaa) >> 1) | ((res & 0x55555555) << 1);
return res;
}
}