位移枚舉簡單介紹

枚舉的三種實(shí)現(xiàn)方式

第一種枚舉

typedef enum {
    MXDemoTypeTop,
    MXDemoTypeBottom
}MXDemoType;

第二種枚舉定義類型

typedef NS_ENUM(NSInteger, MXType) {
    MXTypeTop,
    MXTypeBottom
};

** 第三種枚舉** 位移枚舉
在這感謝下原文作者[天狐博客]|iOS開發(fā)之位移枚舉和按位或按位與運(yùn)算
大家可點(diǎn)擊進(jìn)入原文查看,以下是自己做的一些備注,方便自己理解

相信前兩種枚舉方式大家都很熟悉了,這里主要介紹的是位移枚舉

本文使用 Autoresizing 的系統(tǒng)枚舉UIViewAutoresizing作為基礎(chǔ)進(jìn)行講述
以下位移已經(jīng)計(jì)算提前計(jì)算出來了二進(jìn)制與十進(jìn)制值為了方便下文使用

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {    二進(jìn)制值    十進(jìn)制
   UIViewAutoresizingNone                 = 0,         0000 0000  0
   UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,    0000 0001  1
   UIViewAutoresizingFlexibleWidth        = 1 << 1,    0000 0010  2
   UIViewAutoresizingFlexibleRightMargin  = 1 << 2,    0000 0100  4
   UIViewAutoresizingFlexibleTopMargin    = 1 << 3,    0000 1000  8
   UIViewAutoresizingFlexibleHeight       = 1 << 4,    0001 0000  16
   UIViewAutoresizingFlexibleBottomMargin = 1 << 5     0010 0000  32
};

使用枚舉定義選項(xiàng),每個(gè)選項(xiàng)均可啟用或禁用,使用上述方式來定義枚舉值,每個(gè)枚舉值所對應(yīng)的二進(jìn)制表示中,只有1個(gè)二進(jìn)制位的值是1。
用“按位或操作符”可組合多個(gè)選項(xiàng),用 | 來隔開,如下述實(shí)例:

- (void)viewDidLoad {
   [super viewDidLoad];

   [self todo:UIViewAutoresizingFlexibleLeftMargin|
UIViewAutoresizingFlexibleRightMargin|
UIViewAutoresizingFlexibleHeight];
}

-(void)todo:(UIViewAutoresizing)type{
   if (type==0) {
       NSLog(@"UIViewAutoresizingNone");
       return;
   }
   if (type & UIViewAutoresizingFlexibleLeftMargin) {
       NSLog(@"UIViewAutoresizingFlexibleLeftMargin");
   }
   if (type & UIViewAutoresizingFlexibleWidth) {
       NSLog(@"UIViewAutoresizingFlexibleWidth");

   }
   if (type & UIViewAutoresizingFlexibleRightMargin) {
       NSLog(@"UIViewAutoresizingFlexibleRightMargin");

   }
   if (type & UIViewAutoresizingFlexibleTopMargin) {
       NSLog(@"UIViewAutoresizingFlexibleTopMargin");

   }
   if (type & UIViewAutoresizingFlexibleHeight) {
       NSLog(@"UIViewAutoresizingFlexibleHeight");

   }
   if (type & UIViewAutoresizingFlexibleBottomMargin) {
       NSLog(@"UIViewAutoresizingFlexibleBottomMargin");
   }
}

結(jié)果輸出

UIViewAutoresizingFlexibleLeftMargin
UIViewAutoresizingFlexibleRightMargin
UIViewAutoresizingFlexibleHeight

位移位運(yùn)算


如 UIViewAutoresizingFlexibleHeight = 1 << 4,
1.左移運(yùn)算 1 << 4
將一個(gè)運(yùn)算對象的各二進(jìn)制位全部左移若干位(左邊的二進(jìn)制位丟棄,右邊補(bǔ)0)。
1 轉(zhuǎn)化為二進(jìn)制為 :0000 0001
左移四位就為 :0001 0000
0001 0000 轉(zhuǎn)化為十進(jìn)制等于16

2.右移運(yùn)算 90>>4
將一個(gè)數(shù)的各二進(jìn)制位全部右移若干位,正數(shù)左補(bǔ)0,負(fù)數(shù)左補(bǔ)1,右邊丟棄。操作數(shù)每右移一位,相當(dāng)于該數(shù)除以2。
90轉(zhuǎn)化為二進(jìn)制為 :01011010
右移4位就是 :00000101
00000101 轉(zhuǎn)化為十進(jìn)制等于5

按位或運(yùn)算符(|)

運(yùn)算規(guī)則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :參加運(yùn)算的兩個(gè)二進(jìn)制對應(yīng)數(shù)位只要有一個(gè)為1,其值為1。
例如

[self todo:UIViewAutoresizingFlexibleLeftMargin|
UIViewAutoresizingFlexibleRightMargin|
UIViewAutoresizingFlexibleHeight];

十進(jìn)制1 | 4 | 16 轉(zhuǎn)二進(jìn)制0000 0001 | 0000 0100 | 0001 0000 = 0001 0101,因此,1 | 4 | 16的十進(jìn)制值為21

按位與運(yùn)算符(&)

參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行“與”運(yùn)算。
運(yùn)算規(guī)則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:兩對應(yīng)數(shù)位同時(shí)為“1”,結(jié)果才為“1”,否則為0
十進(jìn)制3 & 5 轉(zhuǎn)二進(jìn)制 0000 0011 & 0000 0101 = 0000 0001 ,因此,3 & 5的值為1
iOS在方法中的應(yīng)用
上文知道結(jié)果是 0001 0101,十進(jìn)制值得21,UIViewAutoresizingFlexibleRightMargin為4
0001 0101 & UIViewAutoresizingFlexibleRightMargin == 0001 0101 & 0000 0100 =21 & 4 = 4
根據(jù)計(jì)算結(jié)果還是UIViewAutoresizingFlexibleRightMargin這個(gè)枚舉

**理論上更嚴(yán)謹(jǐn)?shù)膶懛☉?yīng)該是 **

if((type&UIViewAutoresizingFlexibleRightMargin)==UIViewAutoresizingFlexibleRightMargin){}

二進(jìn)制轉(zhuǎn)十進(jìn)制

二進(jìn)制轉(zhuǎn)十進(jìn)制通用公式

十進(jìn)制轉(zhuǎn)二進(jìn)制

十進(jìn)制轉(zhuǎn)二進(jìn)制通用公式
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容