首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

位元操作技巧:16 位元整數位元反轉演算法詳解

     編輯:關於C

問題定義

將 16 位元無號整數的位元順序完全反轉:bit 0 ↔ bit 15、bit 1 ↔ bit 14、…、bit 7 ↔ bit 8。

例:0xB35E (1011 0011 0101 1110) → 0x7ACD (0111 1010 1100 1101)

演算法邏輯

只需處理前 8 位(i = 0..7),每輪交換 bit i 與 bit 15-i:

  1. 取出 bit i:(data >> i) & 1
  2. 移至目標位置 15-i:((data >> i) & 1) << (15 - i)
  3. 同理取出 bit 15-i 移至 i
  4. 兩者合併 | 累加至結果

C 語言實作

uint16_t reverse_bits16(uint16_t data)
{
    uint16_t dest = 0;
    for (int i = 0; i < 8; ++i) {
        uint16_t low_bit  = (data >> i) & 1;
        uint16_t high_bit = (data >> (15 - i)) & 1;
        dest |= (low_bit  << (15 - i)) | (high_bit << i);
    }
    return dest;
}

逐步追蹤範例(data = 0xB35E = 45918)

ilow_bit<<(15-i)high_bit<合併dest 累積
00x00000x00010x00010x0001
10x40000x00000x40000x4001
20x20000x00040x20040x6005
30x10000x00080x10080x700D
40x08000x00000x08000x780D
50x00000x00000x00000x780D
60x02000x00400x02400x7A4D
70x00000x00800x00800x7ACD

最終 dest = 0x7ACD,與預期相符。

效能優化方向

  • 查表法:預計算 256 個 byte 反轉值,兩次查表 + 移位合併,O(1) 無迴圈。
  • SWAR (SIMD Within A Register):以位元運算平行交換(如 0x5555、0x3333、0x0F0F、0x00FF 遮罩),無分支、指令級平行。
  • 編譯器內建:GCC/Clang __builtin_bswap16、MSVC _byteswap_ushort。

應用場景

  • 網路位元序轉換(大小端轉換)
  • CRC 校驗位元反轉
  • 位元壓縮/解壓、霍夫曼編碼
  • 嵌入式裝置暖存器鏡像
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved