实现二进制反转可以通过多种方法完成,以下是几种常见的方法及其实现方式:
一、逐位翻转法(适用于任意位数)
通过循环逐位提取原数的最低位,并将其放到结果数的最高位。具体步骤如下:
1. 初始化结果变量为0。
2. 循环32次(针对32位整数),每次将原数右移1位,最低位通过`n % 2`提取,然后与结果变量左移1位后按位或运算。
3. 循环结束后结果即为反转后的二进制数。
C++实现示例:
```cpp
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = 0;
for (int i = 0; i < 32; ++i) {
res = (res << 1) | (n & 1);
n >>= 1;
}
return res;
}
};
```
二、分治法(按位块交换)
将32位整数分成多个块(如每2位一组),逐组交换位置。例如:
原数:`01 0111 01011101`
交换后:`10 1100 01011101`
继续交换更高位块,最终得到完全反转的数。
C++实现示例:
```cpp
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
n = ((n >> 16) & 0x0000FFFF) |
((n >> 8) & 0x00FF00FF) |
((n >> 4) & 0x0F0F0F0F) |
((n & 0x0000FFFF) << 12);
n = ((n >> 8) & 0x00FF00FF) |
((n >> 4) & 0x0F0F0F0F) |
((n & 0x00FF00FF) << 4) |
((n & 0x0000FFFF) << 16);
n = ((n >> 4) & 0x0F0F0F0F) |
((n & 0x00F0F0F0) << 4) |
((n & 0x0000F0F0) << 12) |
((n & 0x000000FF) << 20);
n = ((n & 0x0000F0F0) |
((n & 0x000000FF) << 8)) |
((n & 0x0000000F) << 16) |
((n & 0x00000000) << 24);
return n;
}
};
```
三、位运算优化法
通过位移和掩码操作,减少循环次数。例如:
1. 将原数分成两部分:高16位和低16位。
2. 交换这两部分的位置。
3. 重复上述步骤处理剩余的8位、4位等。
C++实现示例:
```cpp
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
n = (n >> 16) | (n << 16);
n = (n >> 8) | (n << 8);
n = (n >> 4) | (n << 4);
n = (n >> 2) | (n << 2);
n = (n >> 1) | (n << 1);
return n;
}
};
```
四、其他语言示例
Python:使用内置函数`bin()`或字符串操作实现。
```python
def reverse_bits(n):
return int(bin(n)[2:][::-1], 2)
```
Java:通过`StringBuilder`反转字符串,或使用位运算。
```java
public static int reverseBinary(int num) {
int reversedNum = 0;
while (num != 0) {
reversedNum <<= 1;
reversedNum |= (num & 1);
num >>= 1;
}
return reversedNum;
}
```
总结
以上方法中,逐位