本帖最后由 f556 于 2019-11-26 10:50 編輯
再次翻看多年前的日志,看到自己記錄的算法,聯想到前些天論壇有人問了一個簡單的問題:“怎么交換兩組數?”
當時有人回答用中間變量,這是一種常用的方法。這個思路好比以下例子:一杯果汁A、一碗牛奶B,現在要互換一下容器,即把A換到碗里,B換到杯里。只有借助第3個容器C。操作是A--->C,B---->A,C----->B,這樣才能完成交換。
有人回答用加減法,思路不錯:
a=3;b=5;
a=a+b;
b=a-b;
a=a-b;
但當時我提出有溢出問題,如235+122怎么辦,設定a、b均為unsigned char;如果均為unsigned int同樣有問題,不能用程序來限定a、b值的范圍,特別是ADC的值。
我日志記錄的不用中間數交換兩個變量的方法,均利用C語言的異或運算。
異或邏輯:對應的位相比較,同=0,異=1,實際上可以理解就“按位求異”,即“異為真,同為假”
舉例:
xxxx 1001 ^ 0000 1111 = xxxx 0110(后4位翻轉)
xxx1 xxxx ^ 1 0000 =xxx0 xxxx
xxx0 xxxx ^ 1 0000 =xxx1 xxxx
程序如下:
unsigned int aa=3456,bb=7890;
void main( void )
{
aa=aa^bb;
bb=bb^aa;
aa=aa^bb;
}
運行結果見圖片。
|