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

16 位整數位元反轉演算法:逐位交換法實現與測試驗證

     編輯:關於C語言

演算法目標

將 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;
}

逐步執行邏輯解析(以 Data = 45918 = 0xB35E 為例)

二進位: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

優化方向

  1. 查表法:預計算 256 個 byte 反轉值,兩次查表 + 移位合成,O(1) 且極快。
  2. SWAR (SIMD Within A Register):利用並行位元運算分階段反轉(如 x = ((x & 0x5555) << 1) | ((x & 0xAAAA) >> 1) ...),無分支、指令級並行。
  3. 硬體指令:部分架構提供位元反轉指令(ARM RBIT, x86 BMI2 ROR 組合)。

適用場景

  • 網路協定大小端轉換(位元級)。
  • CRC 校驗、加密演算法中的位元置換。
  • 嵌入式系統無硬體位元反轉指令時的軟體實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved