C語言位操作技巧 之 標志位
位操作的作用
????位操作在C語言中不是必須的, 但是熟練使用位操作可以節(jié)省內(nèi)存和提高運行效率. 編譯器可能會使用位操作來優(yōu)化代碼, 所以反匯編的代碼可以看到很多位操作指令.

常用位運算
????位與(&), 0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1;
????位或(|), 0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1;
????位非(~), ~0 = 1, ~1 = 0;
????異或(^), 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0.

標志位
????例子: 假設(shè)要用很多布爾標志表示一個人的特征,? 是否長頭發(fā), 是否結(jié)婚等, 通常情況是在結(jié)構(gòu)體中定義很多個布爾變量. 要判斷是否全部條件滿足的時候, 需要很多個邏輯與, 也就是
if (a && b && c ... ), 這樣就需要很多次判斷, 效率比較低.
????如果用標志位來表示, 判斷起來就比較簡單了. 可以使用一個int 表示一個人的特征, 一個int通常是32位, 每位表示一個特征, 因此最多可以表示32個特征.? 比如用位0表示是否長頭發(fā), 位1表示是否結(jié)婚, ...
????設(shè)置和獲取某位需要一個掩碼mask, 掩碼的就是只有要操作的位為1, 其他位都為0的值.
比如要操作值value的位7, 則掩碼是 0100 0000, 要操作位6, 掩碼是 0010 0000...

生成位n的掩碼的表達式為:
????mask = (1 << n)
設(shè)置位7為1的表達式為:
?value |= mask
因為, mask只有位7為1, 0 | 1 = 1, 1 | 1 = 1, 所以可以設(shè)置位7為1, 而mask的其他位是0, 0 | 0 = 0, 0 | 1 = 1, 也就是不會影響其他位;

設(shè)置位7為0的表達式為,:
value &= ~mask
因為, ~mask只有位7為0, 其他位都為1, 而 0 & 0 = 0, 1 & 0 = 0, 可以設(shè)置位7為1, 對于其他位, 0 & 1 = 0, 1 & 1 = 1, 沒有影響.

根據(jù)布爾值b(b=0或b=1)來設(shè)置位7的表達式為:
?value = (value & make) | (b << 7)

以上表達式可以推廣到多個位, 只需要修改掩碼就可以輕松做到.
比如同時設(shè)置位7和位1為1, 掩碼為 0100 0010, 也就是將位7的掩碼和位1的掩碼執(zhí)行 位或得到, 表達式為:
????value |= (mask1 | mask7)
同時設(shè)置位7和位1為0, 掩碼同樣是 0100 0010, 表達式為:
????value &= ~(mask1 | mask7)

判斷多個條件是否滿足(多位同時為1)的表達式為:
(value & (mask1 | mask2 | ... | mask)) != 0
其中, mask1, mask2, maskn 是n個條件對應(yīng)位的掩碼. 比如要用位7表示是否長頭發(fā), 用位1表示是否結(jié)婚, 那么同時長頭發(fā)與結(jié)婚可以用 (value & 0100 0010) != 0 判斷.
????
????
????
????
????