在寫工具類,寫到切圓角的時候突然對UIRectCorner這個枚舉感興趣,於是研究了一下ios中的位掩碼。
實際使用的是二進制運算,所以會用到&(與運算符)、|(或運算符)、~(取反運算符)以及>>、<<(移位運算符)。
舉例定義
typedef NS_OPTIONS(NSUInteger, ZYViewFrameOption) {
ZYViewFrameOptionX = 1 << 0,
ZYViewFrameOptionY = 1 << 1,
ZYViewFrameOptionWidth = 1 << 2,
ZYViewFrameOptionHeight = 1 << 3,
};
這裏<<表示向左移位
增加一項時使用 |
self.options |= ZYViewFrameOptionX;
舉例:self.options是ZYViewFrameOptionWidth,即1<<2,0100,二進制的4。
增加一項ZYViewFrameOptionX,0001。
|或運算符兩兩相對,有1則1,無1則0。
0100
0001
計算完成是0101,二進制的5。
判斷時使用&
(self.options & ZYViewFrameOptionWidth) ==ZYViewFrameOptionWidth ;
&的用處是與運算,11得1,其餘都是0
0101
0100
計算得0100,和值相符合,表示存在。
也就是說第i位的值是
(self.options & 1<<i) == 1<<i;
同理如果判斷不存在,=0就可以。
刪除一項時使用&~
self.options &= ~ZYViewFrameOptionX;
~的用處是取反,X是0001,取反爲1110.
計算下來是0100,就是ZYViewFrameOptionWidth的值。