颠倒二进制位——位运算
时间: 2025-08-22 13:10:47 AIGC 浏览: 13
在位运算中,颠倒一个二进制数的位可以通过多种方法实现。以下是两种常见且高效的实现方式:
### 方法一:逐位提取并构建
此方法通过循环从原始数中逐位提取最低位,并将其放置在新数的高位上,最终完成二进制位的颠倒。
#### Python 示例:
```python
def reverseBits(n):
reversed_num = 0
for i in range(32):
# 提取 n 的最低位,并将其左移到对应的位置
bit = (n >> i) & 1
# 将提取的位放入新数的高位
reversed_num |= (bit << (31 - i))
return reversed_num
```
#### C 示例:
```c
#include <stdio.h>
#define uint32_t unsigned int
uint32_t reverseBits(uint32_t n) {
uint32_t num = 0;
for(int i = 0; i < 32; i++) {
num += ((n & 1) << (31 - i)); // 将最后一位放到对应的位置
n >>= 1; // 右移一位,继续处理下一位
}
return num;
}
int main() {
uint32_t n = 4294967293;
printf("%u\n", reverseBits(n));
return 0;
}
```
### 方法二:分治法(位运算优化)
该方法利用分治策略,通过不断交换相邻的位块,逐步完成整个二进制数的颠倒。这种方法在硬件实现或性能要求较高的场景中非常高效。
#### Python 示例:
```python
def reverseBits(n):
# 分治掩码
m1 = 0x55555555 # 01010101...
m2 = 0x33333333 # 00110011...
m4 = 0x0F0F0F0F # 00001111...
m8 = 0x00FF00FF # 0000000011111111...
# 交换相邻的单个位
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)
# 交换相邻的十六个位
n = (n >> 16) | (n << 16)
return n
```
#### C 示例:
```c
uint32_t reverseBits(uint32_t n) {
const unsigned int x1 = 0x55555555;
const unsigned int x2 = 0x33333333;
const unsigned int x3 = 0x0F0F0F0F;
const unsigned int x4 = 0x00FF00FF;
n = ((n >> 1) & x1) | ((n & x1) << 1);
n = ((n >> 2) & x2) | ((n & x2) << 2);
n = ((n >> 4) & x3) | ((n & x3) << 4);
n = ((n >> 8) & x4) | ((n & x4) << 8);
return (n >> 16) | (n << 16);
}
```
这两种方法各有优劣。逐位提取适用于逻辑清晰、易于理解的场景,而分治法则在性能上更优,尤其适用于硬件加速或高性能计算环境。
---
###
阅读全文
相关推荐








