美文网首页iOS进阶
位移枚举简单介绍

位移枚举简单介绍

作者: lyonLiu | 来源:发表于2016-09-21 13:45 被阅读582次

枚举的三种实现方式

第一种枚举

typedef enum {
    MXDemoTypeTop,
    MXDemoTypeBottom
}MXDemoType;

第二种枚举定义类型

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

** 第三种枚举** 位移枚举
在这感谢下原文作者[天狐博客]|iOS开发之位移枚举和按位或按位与运算
大家可点击进入原文查看,以下是自己做的一些备注,方便自己理解

相信前两种枚举方式大家都很熟悉了,这里主要介绍的是位移枚举

本文使用 Autoresizing 的系统枚举UIViewAutoresizing作为基础进行讲述
以下位移已经计算提前计算出来了二进制与十进制值为了方便下文使用

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {    二进制值    十进制
   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
};

使用枚举定义选项,每个选项均可启用或禁用,使用上述方式来定义枚举值,每个枚举值所对应的二进制表示中,只有1个二进制位的值是1。
用“按位或操作符”可组合多个选项,用 | 来隔开,如下述实例:

- (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");
   }
}

结果输出

UIViewAutoresizingFlexibleLeftMargin
UIViewAutoresizingFlexibleRightMargin
UIViewAutoresizingFlexibleHeight

位移位运算


如 UIViewAutoresizingFlexibleHeight = 1 << 4,
1.左移运算 1 << 4
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
1 转化为二进制为 :0000 0001
左移四位就为 :0001 0000
0001 0000 转化为十进制等于16

2.右移运算 90>>4
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2。
90转化为二进制为 :01011010
右移4位就是 :00000101
00000101 转化为十进制等于5

按位或运算符(|)

运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个二进制对应数位只要有一个为1,其值为1。
例如

[self todo:UIViewAutoresizingFlexibleLeftMargin|
UIViewAutoresizingFlexibleRightMargin|
UIViewAutoresizingFlexibleHeight];

十进制1 | 4 | 16 二进制0000 0001 | 0000 0100 | 0001 0000 = 0001 0101,因此,1 | 4 | 16的十进制值为21

按位与运算符(&)

参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两对应数位同时为“1”,结果才为“1”,否则为0
十进制3 & 5 二进制 0000 0011 & 0000 0101 = 0000 0001 ,因此,3 & 5的值为1
iOS在方法中的应用
上文知道结果是 0001 0101,十进制值得21,UIViewAutoresizingFlexibleRightMargin为4
0001 0101 & UIViewAutoresizingFlexibleRightMargin == 0001 0101 & 0000 0100 =21 & 4 = 4
根据计算结果还是UIViewAutoresizingFlexibleRightMargin这个枚举

**理论上更严谨的写法应该是 **

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

二进制转十进制

二进制转十进制通用公式

十进制转二进制

十进制转二进制通用公式

相关文章

  • 位移枚举简单介绍

    枚举的三种实现方式 第一种枚举 第二种枚举定义类型 ** 第三种枚举** 位移枚举在这感谢下原文作者[天狐博客]|...

  • Swift&OC位移枚举区别

    1、Swift 位移枚举写法 2、ObjC位移枚举写法 相比之下ObjC更加简单明了。

  • iOS-位移枚举简单介绍

    路漫漫其修远兮,吾将上下而求索。在苹果系统以及我们常用的著名的三方框架中,我们经常会遇到位运算,比如像系统中的UI...

  • 位移枚举

    位移枚举和普通枚举的区别位移枚举可以传递多个参数,普通的枚举只能传递单个参数 举个?在SDWebimage里有的地...

  • iOS枚举——位移枚举的简单使用

    今天和大家一起来学习一下iOS位移枚举的简单使用,有疏忽的地方,还望各位不吝赐教。 一、枚举的作用 在代码中使用枚...

  • 位移枚举

    位移枚举 C语言枚举定义 苹果创建枚举的定义方式

  • 位移枚举

    枚举的其中一种方式:位移枚举,直接上代码,看完基本就懂了 写一个方法: 在viewDidLoad方法中调用本方法:

  • 位移枚举

    位移枚举 一. OC中常见的三种枚举 C语言枚举 // C语言枚举 typedef enum : NSUInteg...

  • 位移枚举

  • 位移枚举

    使用场景:同一次操作有多个选项,可以同时多选同时禁用摘取一段定义好的iOS代码 写一个方法,需要选择两种特性来实现...

网友评论

    本文标题:位移枚举简单介绍

    本文链接:https://www.haomeiwen.com/subject/onwnettx.html