引子:《程式設計師面試寶典》2c的p37的面試例題中有這樣一道題:
unsignedchara =
oxa5;
unsigned
charb=~
a>>4;
printf("%d
",b);
書上給的答案是正確的,但是講解是錯誤的:「>>」的優先順序高於「~」。這個題作者之所以能夠歪打正著的作對最後的結果,是因為在位運算中,不存8位的位運算,(x86,vc9以及gcc的編譯環境中)編譯器會把這個8位的字元提公升為32位進行運算(實驗結果,未找到文獻)。
先給出一些位運算的一些應用:
1.補齊至某個數的倍數
stl裡面的二級空間配置器裡,對於小記憶體的分配是有獨特的策略的(詳見侯捷:《stl原始碼剖析》),當申請的記憶體小於128位元組的時候,會將這個記憶體大小提公升為8的倍數,例如申請的記憶體是7個位元組,那麼配置器會把這個記憶體提公升為8個位元組。那麼你將會怎麼寫這個簡單的補齊至某個數的倍數函式呢?
enum;static
size_t round_up(size_t bytes)
仔細想想,這是為什麼?
2.計算乙個二進位制串中「1」的個數(詳見《程式設計之美》p119)
intcount_1(unsigned
char
i)return
count;
}
將二進位制數與1進行&操作,能判斷出最後一位是否為1。用這個方法也能判斷出這個數的奇偶性,不再詳述。
這個題在程式設計之美上還有更好的解法,演算法複雜度只與1的個數相關:
intcount_1(unsigned
char
a)return
count;
}
3.異或運算與技巧
位運算中的一些技巧
方法一 利用位運算交換兩個數 a a b b a b 右邊等價於a b b a a a b 此時b a 此式右邊等於a b a b方法二 需要考慮a b會不會超過a表達的數值範圍,導致記憶體溢位 a a b b a b 右邊等價於a b b a a a b 此時b等於a,右邊等價於a b a bin...
一些位運算
該篇文章會持續更新將遇到的位運算在這進行解釋 1.按位與 運算 運算規則 0 0 0 0 1 0 1 0 0 1 1 1 例如 8的二進位制 00001000 5的二進位制 00000101 8 5 0000 0000 轉換成十進位制就是0 與運算 的特殊用途 1 清零。如果想將乙個單元清零,即使其...
c 中位運算的一些總結
倘如我們要算a ba b ab,平常只能想到跑乙個for迴圈,乙個乙個的累乘。然而我們可以利用二進位制的思想將b拆開。例 b為11,可拆成 23 21 20 2 3 2 1 2 0 23 21 20 這樣a ba b ab就等於a23 a21 a20 a a a a23 a2 1 a2 0然後我們可...