將 16 位無號整數的位元順序完全反轉:bit 15 ↔ bit 0、bit 14 ↔ bit 1、...、bit 8 ↔ bit 7。
unsigned short SwapBit16(unsigned short Data) {
int i;
unsigned short Dest = 0;
for (i = 0; i < 8; ++i) {
// 取出第 i 位,移至第 (15-i) 位
unsigned short low_to_high = ((Data & (1 << i)) ? 1 : 0) << (15 - i);
// 取出第 (15-i) 位,移至第 i 位
unsigned short high_to_low = ((Data & (1 << (15 - i))) ? 1 : 0) << i;
// 合併到結果
Dest |= (low_to_high + high_to_low);
}
return Dest;
}
二進位:1011 0011 0101 1110
反轉後:0111 1010 1100 1101 = 0x7ACD
迴圈 i=0..7,每次處理一對對稱位元:
low_to_high:將低半部第 i 位搬移到高半部對稱位置。high_to_low:將高半部第 (15-i) 位搬移到低半部對稱位置。| 運算,累積到 Dest。#include <stdio.h>
int main(void) {
int i;
unsigned short Data = 45918; // 0xB35E
unsigned short Dest = 0;
for (i = 0; i < 8; ++i) {
unsigned short part1 = ((Data & (1 << i)) ? 1 : 0) << (15 - i);
unsigned short part2 = ((Data & (1 << (15 - i))) ? 1 : 0) << i;
unsigned short combined = part1 + part2;
Dest |= combined;
printf("Date1=0x%04X Date2=0x%04X Combined=0x%04X\n", part1, part2, combined);
}
printf("Result: 0x%04X\n", Dest); // 輸出 0x7ACD
return 0;
}
Date1=0x0000 Date2=0x0001 Combined=0x0001 // i=0: bit0→bit15, bit15→bit0
Date1=0x4000 Date2=0x0000 Combined=0x4000 // i=1: bit1→bit14, bit14→bit1
Date1=0x2000 Date2=0x0004 Combined=0x2004 // i=2: bit2→bit13, bit13→bit2
...
Result: 0x7ACD
x = ((x & 0x5555) << 1) | ((x & 0xAAAA) >> 1) ...),無分支、指令級並行。RBIT, x86 BMI2 ROR 組合)。