實現 reverse_bit(unsigned int value):將 32 位整數的二進制位從左到右完全反轉。如 25 (0x00000019) → 2550136832 (0x98000000)。
第 i 位(從 0 起)移至第 31-i 位:
result |= ((value >> i) & 1) << (31 - i);
#include <stdio.h>
#include <stdint.h>
uint32_t reverse_bit(uint32_t value) {
uint32_t result = 0;
for (int i = 0; i < 32; i++) {
// 提取第 i 位,放到第 31-i 位
result |= ((value >> i) & 1u) << (31 - i);
}
return result;
}
// 更高效:查表法(4位一查,8次查表)
uint32_t reverse_bit_fast(uint32_t x) {
static const uint8_t rev[16] = {
0x0, 0x8, 0x4, 0xC, 0x2, 0xA, 0x6, 0xE,
0x1, 0x9, 0x5, 0xD, 0x3, 0xB, 0x7, 0xF
};
uint32_t r = 0;
for (int i = 0; i < 8; i++) {
r = (r << 4) | rev[x & 0xF];
x >>= 4;
}
return r;
}
int main() {
uint32_t v = 25; // 00000000 00000000 00000000 00011001
uint32_t r = reverse_bit(v);
printf("原值:%u (0x%08X)\n", v, v);
printf("反轉:%u (0x%08X)\n", r, r);
// 預期:2550136832 (0x98000000)
return 0;
}
原值:25 (0x00000019) 反轉:2550136832 (0x98000000)
25 = 00000000 00000000 00000000 00011001
反轉後 = 10011000 00000000 00000000 00000000
= 0x98000000 = 2550136832 ✓
| 方法 | 操作數 | 適用場景 |
|---|---|---|
| 逐位循環 | 32 次移位、與、或 | 教學、非熱點路徑 |
| 查表法 (4位) | 8 次查表、移位、或 | 高性能要求 |
| 查表法 (8位) | 4 次查表、移位、或 | 極致優化(256 字節表) |
| 編譯器內建 | __builtin_bitreverse32 | GCC/Clang 專用 |