1、使用加法與減法交換兩數值:
#define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = (b) - (a))))
這種交換數值a與b的方法沒有使用臨時變量,初始化檢測a,b,如果在同一內存區,則被忽略,當然這通常不會發生,(編譯器會忽略,然而無論如何都是一種優化),假如可以確
定溢出異常,於是傳遞無符號數異常就不會拋出。
下面的邏輯“或”運算的方法在某些機器上可能要快一些,不要使用浮點型數字。
2、使用邏輯“或”方法交換兩數值:
#define SWAP(a, b) (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))
3、使用邏輯“或”方法交換獨立位:
1 unsigned int i, j; 2 unsigned int n; 3 unsigned int b; 4 unsigned int r; 5 6 unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - 1); // XOR temporary 7 r = b ^ ((x << i) | (x << j));
其中:b為目標數字,以二進制的形式表示,從最右邊比特位開始計算,標號為0,i指向第i+1個比特位,
n指連續比特位的個數,j指向第j+1個比特位,r保存交換后的值。
e.g. b = 00101111 n=3,i=1,j=5
r = 11100011
C測試代碼如下:
#include <stdio.h> #include <string.h> void tranlate(int n) //十進制轉換為二進制 { int a[1000]; int i,L,j; i=L=0; while(n/2){ a[i]=n%2; n/=2; L++,i++; } a[i]=1; while(L<8){ //設置為顯示8位的二進制 a[++i]=0; L++; } for(j=L-1; j>=0; j--){ printf("%d",a[j]); } printf("\n"); } int main(int argc, char *argv[]) { unsigned int i, j; unsigned int n; unsigned int b; unsigned int r; b=47,n=3,i=1,j=5; tranlate(b); unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - 1); r = b ^ ((x << i) | (x << j)); tranlate(r); getchar(); getchar(); return 0; }