不用大小寫 寫個巨集定義求大數

2021-06-19 00:19:48 字數 1234 閱讀 5616

1.請定義乙個巨集,比較兩個數a、b的大小,不能使用大於、小於、if語句

這個題目很早了,網上有很多討論

思路很多,看到其中有乙個思路是 ((a+b)+abs(a-b))/2 就可以得到其中的大數了

確實很精彩,用數學方法,不過其中用到了abs函式

如果把abs函式也自定義了就好了

說幹就幹

寫乙個

int abs(int x)

解釋一下

x>>31位,將符號位移到最右端(當前的int還是32位的....以前16,以後64或更高...)

考慮到如果是負數的話左邊會補1而不是補0

遮蔽一下

(x>>32)&0x00000001

也就是(x>>32)&1

在c++裡面,0為false,非0為true

當有符號(負數)時,條件為真,則應計算絕對值了,否則直接返回

對負數求相反數

首先要知道負數在計算機內部的表示是補碼表示的

關於補碼的知識,請查相關書籍,計算機相關課程應該介紹過了

取反+1得補碼得相反數

(~x+1)

好了,將abs(x)替換到原式((a+b)+abs(a-b))/2

同時將a+b等都加上括號

得到最終得結果

#define max(a,b)   (((a)+(b))+(((((a)-(b))>>31)&1)?(~((a)-(b))+1):((a)-(b))))/2

驗證後,結果正確

補充一點:

max和min函式,用巨集定義得經典實現

#define max(a,b)    (a>b)?a:b

中,存在重複計算問題

比如 max(i++,j--)

這樣的式子,展開後就.....

這個問題在我定義的max中同樣存在著,

如果想避開這個問題,就用函式吧,

不過函式又存在型別檢查的問題

你說:我用模板,

好了模板也有型別匹配和型別轉換的問題

討論到此為止,實現乙個完美的max或者min函式不是那麼簡單的問題

在一些c++討論區中有詳細的討論

還是用巨集定義吧,使用時注意規則就是了.

再看看我們那個有些暈的巨集哥哥

#define max(a,b)   (((a)+(b))+(((((a)-(b))>>31)&1)?(~((a)-(b))+1):((a)-(b))))/2

不用大小寫 寫個巨集定義求大數

1.請定義乙個巨集,比較兩個數a b的大小,不能使用大於 小於 if語句 這個題目很早了,網上有很多討論 思路很多,看到其中有乙個思路是 a b abs a b 2 就可以得到其中的大數了 確實很精彩,用數學方法,不過其中用到了abs函式 如果把abs函式也自定義了就好了 說幹就幹 寫乙個int a...

mysql 區分大小寫 大小寫敏感 配置

linux下mysql預設區分大小寫 windows下mysql預設不區分大小寫 檢視是否區分大小寫 lower case table names引數詳解 lower case table names 0 其中 0 區分大小寫,1 不區分大小寫 mysql在linux下資料庫名 表名 列名 別名大小...

大小寫轉換

小寫數值轉大寫 xieshuxu 傳入轉換字串 傳入整數單位 如 元 傳入小數點後一位單位 如 角 傳入小數點後兩位單位 如 分 public string xiaotoda string xiao,string one,string two,string tree if xiao.indexof ...