二进制逆序是指将二进制数的位顺序颠倒过来。例如,二进制数 `1010` 逆序后为 `0101`。以下是几种常见的实现方法:
一、逐位交换法(适用于小规模数据)
按组交换
将二进制数按2位一组进行高低位交换,例如:
```
原数: 10011100
交换后: 00111001
```
可以通过循环实现,每2位一组右移和左移后相或操作:
```c
unsigned int reverseBits(unsigned int n) {
unsigned int result = 0;
for (int i = 0; i < 32; i += 2) {
unsigned int mask = 0b10;
result |= ((n >> i) & 1) << (16 - i);
}
return result;
}
```
奇偶位交换
将奇数位和偶数位分别右移和左移后相或操作,例如:
```
原数: 10011100
交换后: 01100001
```
实现代码:
```c
unsigned int reverseBits(unsigned int n) {
unsigned int result = 0;
for (int i = 0; i < 16; i++) {
unsigned int mask = 0b01010101;
result |= ((n >> (2 * i)) & 1) << (16 - 2 * i);
}
return result;
}
```
二、查表法(适用于固定位数)
分块查表
预先计算0-255的逆序值,将32位整数分成4个8位块,分别查表后拼接。例如:
```c
unsigned char reverseByte(unsigned char b) {
static const unsigned char table = {
// 预先计算0-255的逆序值
};
return table[b];
}
unsigned int reverseBits(unsigned int n) {
unsigned int result = 0;
for (int i = 0; i < 4; i++) {
result |= (reverseByte((n >> (8 * i)) & 0xFF)) << (8 * i);
}
return result;
}
```
三、位运算优化法
循环移位法
通过循环移位和按位或操作实现逆序,例如:
```c
unsigned int reverseBits(unsigned int n) {
unsigned int result = 0;
for (int i = 0; i < 32; i++) {
result <<= 1;
result |= (n & 1);
n >>= 1;
}
return result;
}
```
四、Python实现示例
```python
def reverse_binary(n):
return int(bin(n)[2:][::-1], 2)
测试
print(reverse_binary(12345)) 输出: 45321
```
总结
逐位交换法和 奇偶位交换法适合小规模数据,时间复杂度为O(32);
查表法适合固定位数(如32位),通过空间换时间提高效率;
位运算优化法通过循环移位实现,简洁且高效。
根据具体需求选择合适的方法,例如32位逆序推荐使用查表法或循环移位法,而小规模数据可用逐位交换法。