首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

位運算技巧:x & 0x55555555 實現相鄰位交換詳解

     編輯:程式設計綜合問答

代碼片段

int swap_bits(int x) {
    return ((x & 0x55555555) << 1) | ((x >> 1) & 0x55555555);
}

0x55555555 的二進制含義

0x55555555 = 0101 0101 0101 0101 0101 0101 0101 0101(32 位)
即:所有奇數位為 1,偶數位為 0(從最低位第 0 位開始計數)。

逐步拆解

  1. (x & 0x55555555):提取 x 的奇數位(第 1、3、5... 位),偶數位清零。
  2. ((x & 0x55555555) << 1):將提取的奇數位左移 1 位,移到偶數位位置。
  3. (x >> 1):將 x 右移 1 位,原偶數位移到奇數位位置。
  4. ((x >> 1) & 0x55555555):提取移位後的奇數位(即原偶數位)。
  5. |:將兩部分合併,完成相鄰兩位交換(第 0↔1、2↔3、4↔5...)。

圖示說明

原始 x:        b7 b6 b5 b4 b3 b2 b1 b0
掩碼 0x55:     0  1  0  1  0  1  0  1
x & 0x55:      0  b6 0  b4 0  b2 0  b0  → 左移 → b6 0 b4 0 b2 0 b0 0
x >> 1:        0  b7 b6 b5 b4 b3 b2 b1
(x>>1)&0x55:   0  b7 0  b5 0  b3 0  b1
合併結果:      b6 b7 b4 b5 b2 b3 b0 b1  ← 每兩位交換

應用場景

  • 位元反轉、奇偶校驗預處理
  • 哈希函數、加密算法中的位擾動
  • 嵌入式系統中緊湊數據結構的讀寫優化

擴展:交換任意相鄰 n 位

同理,掩碼可推廣:0x33333333(雙位交換)、0x0F0F0F0F(4 位交換)等,構成經典的「位反轉」算法基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved