寫乙個MAX巨集定義(不使用大於,小於,和if)

2021-06-19 05:57:18 字數 586 閱讀 1948

請定義乙個巨集,比較兩個數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了。之前一直以為他在那個巨集裡面有個呼叫全劇靜態註冊函...