亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是位屏蔽?

什么是位屏蔽?

C
瀟瀟雨雨 2019-09-18 13:40:57
我對C編程很新,我遇到了掩碼。有人可以向我解釋位屏蔽的一般概念和功能嗎?非常感謝例子。
查看完整描述

2 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

掩碼定義要保留的位以及要清除的位。


掩蔽是將掩碼應用于值的行為。這是通過以下方式完成的:


按位AND運算以提取值中的位的子集

按位ORing以設置值中的位的子集

按位異或,以切換值中的位的子集

下面是提取值中位的子集的示例:


Mask:   00001111b

Value:  01010101b

將掩碼應用于值意味著我們要清除第一個(更高)4位,并保留最后(較低)4位。因此我們提取了低4位。結果是:


Mask:   00001111b

Value:  01010101b

Result: 00000101b

使用AND實現掩碼,因此在C中我們得到:


uint8_t stuff(...) {

  uint8_t mask = 0x0f;   // 00001111b

  uint8_t value = 0x55;  // 01010101b

  return mask & value;

}

這是一個相當常見的用例:從較大的單詞中提取單個字節。我們將字中的高位定義為第一個字節。我們使用兩個運算符&,和>>(右移)。這是我們如何從32位整數中提取四個字節:


void more_stuff(uint32_t value) {             // Example value: 0x01020304

    uint32_t byte1 = (value >> 24);           // 0x01020304 >> 24 is 0x01 so

                                              // no masking is necessary

    uint32_t byte2 = (value >> 16) & 0xff;    // 0x01020304 >> 16 is 0x0102 so

                                              // we must mask to get 0x02

    uint32_t byte3 = (value >> 8)  & 0xff;    // 0x01020304 >> 8 is 0x010203 so

                                              // we must mask to get 0x03

    uint32_t byte4 = value & 0xff;            // here we only mask, no shifting

                                              // is necessary

    ...

}

請注意,您可以切換上面的運算符的順序,您可以先執行掩碼,然后再進行移位。結果是一樣的,但現在你必須使用不同的掩碼:


uint32_t byte3 = (value & 0xff00) >> 8;


查看完整回答
反對 回復 2019-09-18
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

屏蔽意味著保持/更改/刪除所需的信息部分。讓我們看一下圖像掩蓋操作; 喜歡 - 這種掩蔽操作正在移除任何不是皮膚的東西 -

http://img1.sycdn.imooc.com//5d81c39200018ad816640494.jpg

我們在這個例子中做了AND操作。還有其他屏蔽操作符 - OR,XOR。


位掩碼意味著在位上施加掩碼。以下是AND的掩蓋-


     1 1 1 0 1 1 0 1   [input]

(&)  0 0 1 1 1 1 0 0    [mask]

------------------------------

     0 0 1 0 1 1 0 0  [output]

因此,只保留中間的4位(因為這些位1在此掩碼中)。


讓我們看看XOR -


     1 1 1 0 1 1 0 1   [input]

(^)  0 0 1 1 1 1 0 0    [mask]

------------------------------

     1 1 0 1 0 0 0 1  [output]

現在,中間的4位被翻轉(1變成了0,0變成了1)。


因此,使用位掩碼我們可以訪問各個位[ 示例 ]。有時,這種技術也可用于提高性能。以此為例 -


bool isOdd(int i) {

    return i%2;

}

該函數告訴整數是奇數還是偶數。我們可以使用位掩碼以更高的效率實現相同的結果 -


bool isOdd(int i) {

    return i&1;

}

簡短說明:如果二進制數的最低有效位1是奇數; 因為0它會是均勻的。因此,通過執行AND,1我們將刪除除最低有效位之外的所有其他位,即:


     55  ->  0 0 1 1 0 1 1 1   [input]

(&)   1  ->  0 0 0 0 0 0 0 1    [mask]

---------------------------------------

      1  <-  0 0 0 0 0 0 0 1  [output]


查看完整回答
反對 回復 2019-09-18
  • 2 回答
  • 0 關注
  • 938 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號