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