最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C語言位操作技巧 之 標志位

2022-11-11 22:47 作者:GC_CH  | 我要投稿

位操作的作用

????位操作在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 判斷.

????

????

????

????

????

C語言位操作技巧 之 標志位的評論 (共 條)

分享到微博請遵守國家法律
河曲县| 蒙城县| 新绛县| 清远市| 廉江市| 鄱阳县| 新丰县| 玉环县| 皋兰县| 德令哈市| 房山区| 新乐市| 若尔盖县| 万宁市| 杭锦后旗| 华坪县| 璧山县| 海南省| 洮南市| 彝良县| 政和县| 吕梁市| 洪泽县| 徐水县| 崇阳县| 咸阳市| 博罗县| 白沙| 花莲市| 毕节市| 宜阳县| 黄大仙区| 岗巴县| 许昌县| 长顺县| 奉化市| 双柏县| 孝感市| 河池市| 政和县| 静海县|