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

C 語言利用 XOR 交換任意類型變量:宏實現與原理深度解析

     編輯:關於C語言

XOR 交換整數的原理

a ^= b; b ^= a; a ^= b; 三步完成交換。核心規律:一個值連續異或同一值兩次保持不變。以布爾值為例,四種組合 (0,0)(1,0)(0,1)(1,1) 經三步皆完成交換。

擴展至任意類型

因所有數據在記憶體中均為二進制存儲,XOR 作用於位模式,故適用於 char、short、int、long、float、double、指針等任意類型。

通用交換宏實現

#define XYZ_SWAP(i, j) \
if (&i != &j) { \
    switch(sizeof(i)) { \
        case 1: *(char*)&i ^= *(char*)&j; *(char*)&j ^= *(char*)&i; *(char*)&i ^= *(char*)&j; break; \
        case 2: *(short*)&i ^= *(short*)&j; *(short*)&j ^= *(short*)&i; *(short*)&i ^= *(short*)&j; break; \
        case 4: *(long*)&i ^= *(long*)&j; *(long*)&j ^= *(long*)&i; *(long*)&i ^= *(long*)&j; break; \
        case 8: *(long long*)&i ^= *(long long*)&j; *(long long*)&j ^= *(long long*)&i; *(long long*)&i ^= *(long long*)&j; break; \
        default: \
            for (int k = 0; k < sizeof(i); k++) { \
                *((char*)&i + k) ^= *((char*)&j + k); \
                *((char*)&j + k) ^= *((char*)&i + k); \
                *((char*)&i + k) ^= *((char*)&j + k); \
            } \
    } \
}

假設 long 佔 4 字節。宏先檢查地址是否相同(避免自我交換歸零),再按大小分派,超過 8 字節退回逐字節交換。

測試主函數

void main() {
    char ca=10, cb=20; XYZ_SWAP(ca, cb);
    short sa=10, sb=20; XYZ_SWAP(sa, sb);
    int ia=10, ib=20; XYZ_SWAP(ia, ib);
    long long lla=10, llb=20; XYZ_SWAP(lla, llb);
    float fa=10.01f, fb=2000.89f; XYZ_SWAP(fa, fb);
    double da=10.01, db=2000.89; XYZ_SWAP(da, db);
    void* pa=&da; void* pb=&db; XYZ_SWAP(pa, pb);
}

常見問題解答

  • 如何用位異或交換兩數? 同 a^=b; b^=a; a^=b;。
  • 不引入暫存變量交換? 亦可用加減法:a=a+b; b=a-b; a=a-b;(當心溢出)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved