[置頂] 定義一個(gè)宏,比較兩個(gè)數(shù)a、b的大小,不能使用大于、小于、if語(yǔ)句 以及 不用 第三個(gè)數(shù),交換 a,b的值
來(lái)源:程序員人生 發(fā)布時(shí)間:2015-03-18 10:02:21 閱讀次數(shù):3158次
無(wú)意中 1篇博文,介紹這個(gè)問(wèn)題,引發(fā)了我的興趣。
博文中 介紹了 3種方法:
1.
#define max(a,b) ((((a)-(b))&(1<<31))?(b):(a))
2.
#define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a))
3
#define max(a,b) (((abs((a)-(b)))==((a)-(b)))?(a):(b))
第1種方法 和第2種方法 的原理都是1樣的,就是 根據(jù) (a) - (b) 的結(jié)果 的 符號(hào)位 來(lái)判斷 的,但是 疏忽了 類型的問(wèn)題,在不同的機(jī)型上 int 可以是 16 位 或 32 位,
long 可以是 32 位 或 64位 ,用 1<<31 或 0x80000000 和 (a) - (b) 來(lái)進(jìn)行 & 運(yùn)算 都是 不適合的。
第3種方法正好解決了 上面的問(wèn)題。但是 疏忽了 浮點(diǎn)型問(wèn)題。
所以 最好的方法 是 將 abs 換成 fabs
#define max(a,b) (((fabs((a)-(b)))==((a)-(b)))?(a):(b))
下面 來(lái)講另外一個(gè)話題: 假定 有 int a = 7 , int b = 8 ,不用 第3個(gè)數(shù) 來(lái) 交換 a,b
答案:
a = a + b;
b = a - b;
a = a - b;
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)