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 ...