|
本帖最后由 f556 于 2019-11-26 10:50 編輯
再次翻看多年前的日志,看到自己記錄的算法,聯(lián)想到前些天論壇有人問了一個(gè)簡(jiǎn)單的問題:“怎么交換兩組數(shù)?”
當(dāng)時(shí)有人回答用中間變量,這是一種常用的方法。這個(gè)思路好比以下例子:一杯果汁A、一碗牛奶B,現(xiàn)在要互換一下容器,即把A換到碗里,B換到杯里。只有借助第3個(gè)容器C。操作是A--->C,B---->A,C----->B,這樣才能完成交換。
有人回答用加減法,思路不錯(cuò):
a=3;b=5;
a=a+b;
b=a-b;
a=a-b;
但當(dāng)時(shí)我提出有溢出問題,如235+122怎么辦,設(shè)定a、b均為unsigned char;如果均為unsigned int同樣有問題,不能用程序來限定a、b值的范圍,特別是ADC的值。
我日志記錄的不用中間數(shù)交換兩個(gè)變量的方法,均利用C語言的異或運(yùn)算。
異或邏輯:對(duì)應(yīng)的位相比較,同=0,異=1,實(shí)際上可以理解就“按位求異”,即“異為真,同為假”
舉例:
xxxx 1001 ^ 0000 1111 = xxxx 0110(后4位翻轉(zhuǎn))
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;
}
運(yùn)行結(jié)果見圖片。
|
-
stest.jpg
(102.67 KB, 下載次數(shù): 291)
下載附件
2019-11-26 10:48 上傳
還未運(yùn)行
-
stest2.jpg
(62.3 KB, 下載次數(shù): 314)
下載附件
2019-11-26 10:50 上傳
運(yùn)行完
評(píng)分
-
查看全部評(píng)分
|