- 奇偶判斷
只需要判斷數(shù)字的最后一個(gè)比特位是0 還是 1, 只要最后一位為0 都可以表示成 x*2 即 x<<1
bool is_odd(int i){
return i&1;
} - 交換兩數(shù)
a 和 b 進(jìn)行交換 鱼蝉,一般最常用的是
c=a;
a=b;
b=c;
又或者,不用第三個(gè)變量
a=a+b;
b=a-b;
a=a-b;
以上翻譯成匯編語(yǔ)言可能生成的代碼比較多,可以通過(guò)異或運(yùn)算進(jìn)行交換,依據(jù)的原理有兩點(diǎn) 1) 一個(gè)數(shù)和自身異或?yàn)? ; 2)一個(gè)數(shù)和0異或是自身。
a=a^b
b=a^b
a=a^b
變換符號(hào)
我們以前學(xué)習(xí)計(jì)算機(jī)基礎(chǔ)的時(shí)候,都知道一個(gè)負(fù)的二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制應(yīng)該是多少,怎么計(jì)算秦驯? 對(duì),就是對(duì)該二進(jìn)制的bit 位 取反+1 挣棕。對(duì)于整數(shù)轉(zhuǎn)換成負(fù)數(shù)也是如此译隘。所以對(duì)于一個(gè)數(shù)取反應(yīng)該就是
~a+1取絕對(duì)值
int i = a >> 31; //獲取符號(hào)位
int abs = (i == 0 ? a : (~a + 1)) ;// 如果i==0 代表是正數(shù),直接返回即可洛心,否則為-1取反固耘。
我們知道一個(gè)數(shù)和-1 (0xFFFFFFFF)異或就是取反; 和0 異或就是自身, 所以上面求abs的時(shí)候可以表示為 (a ^ -1)+1 ; 而 i 不是0 就是-1 词身,所以abs 賦值可以進(jìn)一步優(yōu)化為 ( a^i)-i 厅目。
所以取反的步驟少了判斷,即為 :
int i = a >> 31;
int abs=(a^i)-i;