請定義乙個巨集,比較兩個數a、b的大小,不能使用大於、小於、if語句
思路很多
(1) ((a+b)+abs(a-b))/2 就可以得到其中的大數了
用數學方法實現,不過其中用到了abs函式
此時將abs()函式也自己定義
int abs(int x)
return (((x>>31)&1)?(~x+1):x)
注釋:x>>31位,將符號位移到最右端(當前的int還是32位的....以前16,以後64或更高...)
考慮到如果是負數的話左邊會補1而不是補0
接著:(x>>32)&0x00000001 也就是(x>>32)&1 當為真時,為負數,得到1,返回此數(負數)的補碼;否則返回此數(正數)的原碼。
此時,得到最終結果:
#define max(a,b) (((a)+(b))+(((((a)-(b))>>31 )&1) ?(~((a)-(b))+1):((a)-(b))))/2
(2) max和min函式,用巨集定義得經典實現
#define max(a,b) (a>b)?a:b
關於巨集定義min和max的乙個坑
關於比較函式的兩種常用寫法 巨集定義 define max a,b a b a b 或者是algorithm自帶的max和min函式。現在用algorithm的人比較多但也有不少人認為巨集定義快所以堅持用巨集定義。但事實上巨集定義確實快,但問題是這只限於簡單的變數比較。例如 比較兩個變數 a和b。一...
乙個巨集定義的用法
巨集定義就是簡單的替換,之前沒見過帶符號的替換,看到這個有點懵了,記錄如下。這裡用 n,代替 fninfo n,l 用的很巧妙。define fninfo n,l n,measvalue measfntbl 以下為names.h中內容 fninfo dominmaxmidhilo,min fninf...
c 巨集的乙個小技巧
之前學習過gtest,裡面定義乙個testcase很簡單 test unitname,casename 我比較好奇的就是在你定義完這些test x,x 之後,初始化一下gtest,然後呼叫ruan all test 就能跑你所有的testcase了。之前一直以為他在那個巨集裡面有個呼叫全劇靜態註冊函...