位運算的一些總結和技巧

2022-09-01 21:57:25 字數 988 閱讀 8801

引子:《程式設計師面試寶典》2c的p37的面試例題中有這樣一道題:

unsigned 

chara =

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)

int

count_1(unsigned

char

i)return

count;

}

將二進位制數與1進行&操作,能判斷出最後一位是否為1。用這個方法也能判斷出這個數的奇偶性,不再詳述。

這個題在程式設計之美上還有更好的解法,演算法複雜度只與1的個數相關:

int

count_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然後我們可...