int swap_bits(int x) {
return ((x & 0x55555555) << 1) | ((x >> 1) & 0x55555555);
}
0x55555555 = 0101 0101 0101 0101 0101 0101 0101 0101(32 位)
即:所有奇數位為 1,偶數位為 0(從最低位第 0 位開始計數)。
(x & 0x55555555):提取 x 的奇數位(第 1、3、5... 位),偶數位清零。((x & 0x55555555) << 1):將提取的奇數位左移 1 位,移到偶數位位置。(x >> 1):將 x 右移 1 位,原偶數位移到奇數位位置。((x >> 1) & 0x55555555):提取移位後的奇數位(即原偶數位)。|:將兩部分合併,完成相鄰兩位交換(第 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 ← 每兩位交換
同理,掩碼可推廣:0x33333333(雙位交換)、0x0F0F0F0F(4 位交換)等,構成經典的「位反轉」算法基礎。