C 中交換值與比較值的另類實現方式

2021-07-15 08:19:44 字數 1112 閱讀 4301

1. 比較幾個值的另類實現:

例題1:有兩個變數a和b,不用"if", "?:", "switch"或其他判斷語句,如何實現找出兩個數中比較大的那個。

方法1:int max = ( (a + b) + abs(a -b) ) / 2;

解析:分如下兩種情況:若a > b, abs(a - b) = a - b ,因此,int max = (a + b + a - b) / 2 = 2a / 2 = a;

若a < b, abs(a - b) = b - a , 因此,int max = (a + b + b - a) / 2 = 2b / b = b;

方法2:int c = a - b;

c = unsigned(c) >> (sizeof (int)* 8 - 1);

char *str[2] = ;

return str[c];

解析:利用有符號數轉換為無符號數時最高位是0還是1來判斷正負。

例題2:給三個整數a,b,c,用函式實現取三個數的中間數,不可以使用sort,整數操作盡可能少。

**如下:

inline int max(int a,int b) 

inline int min(int a,int b)

inline int medium(int a,int b ,int c)

2.交換兩個值的另類實現:

例題1:如何將a,b的值就行交換,並且不使用任何中間變數?

方法1:a = a + b;

b  = a - b;

a  =a - b;

分析:缺點是如果a和b都是比較大的數,那麼a+b就有可能會超界。

方法2:a = a ^ b;

b = a ^ b;

a = a ^ b; 

解析:首先是a = a ^ b; 

然後是b = a ^ b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a;

最後是a = a ^ b = a ^ (a ^ b) = a ^ a ^ b = b; 此處的b為原來的值。

C 中的左值與右值

1.c 左值與右值概念 變數和文字常量都有儲存區,並且有相關的型別,區別在於變數是可定址的 對於每個變數,都有2個值與其相關聯 1 資料值,儲存在某個記憶體位址中,也稱右值 rvalue 右值是被讀取的值 read value 文字常量和變數都可被用於右值。2 位址值,即儲存資料值的那塊記憶體位址,...

c 中的左值與右值

左值 lvalue 和右值 rvalue 是 c c 中乙個比較晦澀基礎的概念,有的人可能甚至沒有聽過,但這個概念到了 c 11 後卻變得十分重要,它們是理解 move,forward 等新語義的基礎。左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在等號左邊也能出現在等號...

c 中的左值與右值

左值 lvalue 右值 rvalue 是乙個比較晦澀的概念,有些人可能甚至沒有聽過,但這個概念到了c 11後,卻變得十分重要,它們是理解move forward 等新語義的基礎。那什麼是左值右值呢?左值與右值這兩概念是從c中傳承而來的,在c中,左值指的是能夠出現在等號左邊及右邊的變數 表示式 右值...