2 回答

TA貢獻(xiàn)1772條經(jīng)驗 獲得超8個贊
掩碼定義要保留的位以及要清除的位。
掩蔽是將掩碼應(yīng)用于值的行為。這是通過以下方式完成的:
按位AND運算以提取值中的位的子集
按位ORing以設(shè)置值中的位的子集
按位異或,以切換值中的位的子集
下面是提取值中位的子集的示例:
Mask: 00001111b
Value: 01010101b
將掩碼應(yīng)用于值意味著我們要清除第一個(更高)4位,并保留最后(較低)4位。因此我們提取了低4位。結(jié)果是:
Mask: 00001111b
Value: 01010101b
Result: 00000101b
使用AND實現(xiàn)掩碼,因此在C中我們得到:
uint8_t stuff(...) {
uint8_t mask = 0x0f; // 00001111b
uint8_t value = 0x55; // 01010101b
return mask & value;
}
這是一個相當(dāng)常見的用例:從較大的單詞中提取單個字節(jié)。我們將字中的高位定義為第一個字節(jié)。我們使用兩個運算符&,和>>(右移)。這是我們?nèi)绾螐?2位整數(shù)中提取四個字節(jié):
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
...
}
請注意,您可以切換上面的運算符的順序,您可以先執(zhí)行掩碼,然后再進(jìn)行移位。結(jié)果是一樣的,但現(xiàn)在你必須使用不同的掩碼:
uint32_t byte3 = (value & 0xff00) >> 8;

TA貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊
屏蔽意味著保持/更改/刪除所需的信息部分。讓我們看一下圖像掩蓋操作; 喜歡 - 這種掩蔽操作正在移除任何不是皮膚的東西 -
我們在這個例子中做了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]
現(xiàn)在,中間的4位被翻轉(zhuǎn)(1變成了0,0變成了1)。
因此,使用位掩碼我們可以訪問各個位[ 示例 ]。有時,這種技術(shù)也可用于提高性能。以此為例 -
bool isOdd(int i) {
return i%2;
}
該函數(shù)告訴整數(shù)是奇數(shù)還是偶數(shù)。我們可以使用位掩碼以更高的效率實現(xiàn)相同的結(jié)果 -
bool isOdd(int i) {
return i&1;
}
簡短說明:如果二進(jìn)制數(shù)的最低有效位1是奇數(shù); 因為0它會是均勻的。因此,通過執(zhí)行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]
- 2 回答
- 0 關(guān)注
- 925 瀏覽
添加回答
舉報