將 32 位無符號整數二進位模式完全反轉 (bit 0 ↔ bit 31, bit 1 ↔ bit 30...)。
例:25 (0x00000019) → 0x98000000 (2550136832)。
#includeuint32_t reverse_bits(uint32_t x) { uint32_t rev = 0; for (int i = 0; i < 32; i++) { rev = (rev << 1) | (x & 1); // rev 左移騰位,接入 x 最低位 x >>= 1; } return rev; }
uint32_t reverse_bits_fast(uint32_t x) {
x = ((x >> 1) & 0x55555555) | ((x & 0x55555555) << 1); // 交換相鄰 1 位
x = ((x >> 2) & 0x33333333) | ((x & 0x33333333) << 2); // 交換相鄰 2 位
x = ((x >> 4) & 0x0F0F0F0F) | ((x & 0x0F0F0F0F) << 4); // 交換相鄰 4 位
x = ((x >> 8) & 0x00FF00FF) | ((x & 0x00FF00FF) << 8); // 交換相鄰 8 位
x = (x >> 16) | (x << 16); // 交換高低 16 位
return x;
}
static const uint8_t rev8[256] = { /* 預計算 0~255 反轉 */ };
uint32_t reverse_bits_lut(uint32_t x) {
return (rev8[x & 0xFF] << 24) |
(rev8[(x>>8) & 0xFF] << 16) |
(rev8[(x>>16) & 0xFF] << 8) |
(rev8[x>>24]);
}
int main() {
uint32_t v = 25;
printf("%u\n", reverse_bits(v)); // 2550136832
return 0;
}