枚舉的三種實(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)制
