美文网首页
iOS NS_OPTIONS 位移枚举

iOS NS_OPTIONS 位移枚举

作者: 一代枭雄 | 来源:发表于2022-07-01 11:52 被阅读0次

『前言』

枚举值是一个整形(int),并且它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化.在代码中使用枚举的目的只有一个,那就是增加代码的可读性.

iOS 常用的枚举有两种类型,分别是NS_ENUM和NS_OPTIONS,

普通使用推荐枚举NS_ENUM方式,

需要安位或操作组合的方式就使用枚举NS_OPTIONS,还有个功能就是可以多选

1.创建位移枚举

先创建一个普通的枚举

typedefNS_ENUM(NSUInteger,YLEnum){YLEnumTop=1,// 0000 0001YLEnumBottom,// 0000 0010YLEnumLeft,// 0000 0011YLEnumRight,// 0000 0100};

根据以往的开发经验可以知道YLEnumTop的枚举值是1,YLEnumBottom是2,YLEnumLeft是3,YLEnumRight是4,后面的注释 是转化为二进制后的值

再创一个简单的位移枚举,表示着 上、下、左、右 四个方向

typedefNS_OPTIONS(NSUInteger,YLOptions){YLOptionsTop=1<<0,// 0000 0001YLOptionsBottom=1<<1,// 0000 0010YLOptionsLeft=1<<2,// 0000 0100YLOptionsRight=1<<3,// 0000 1000};

注释:

<<表示向左移动;

表示 :1<<n表示1向左移动n位,

计算公式 :1*2^n1乘以2的n次方;

PS:  位移枚举 YLOptions 第一个枚举值是 YLOptionsTop , 如果该枚举值!=0,那么可以默认传0做参数,这时效率最高(因为在方法optionsDemo:中可以什么都不用做了)

<<位移符移动方法

举个🌰:

YLOptionsLeft=1<<2,// 0000 0100

<<符号前面的1表示基础数值,即要在1的基础上向左移动2位

1的二进制表示为0000 0001,

向左移动2位后的结果就是0000 0100,这个时候YLOptionsLeft的枚举值就变成了4了

经过位移移动后YLOptions的枚举值就可以看成是

typedefNS_OPTIONS(NSUInteger,YLOptions){YLOptionsTop=1,// 0000 0001YLOptionsBottom=2,// 0000 0010YLOptionsLeft=4,// 0000 0100YLOptionsRight=8,// 0000 1000};

举个🌰:

YLOptionsLeft          =  3 << 1,

3的二进制是0000 0011,

移动1位后是0000 0110,

YLOptionsLeft的枚举值就成了 6

公式计算的话就是 3*2^1 = 6。

2.位移枚举的使用

普通枚举NS_ENUM判断可以使用if else和switch

位移枚举NS_OPTIONS的判断方法如下:

-(void)optionsDemo:(YLOptions)type{if(type&YLOptionsTop){NSLog(@"上  %ld",type&YLOptionsTop);}if(type&YLOptionsBottom){NSLog(@"下  %ld",type&YLOptionsBottom);}if(type&YLOptionsLeft){NSLog(@"左  %ld",type&YLOptionsLeft);}if(type&YLOptionsRight){NSLog(@"右  %ld",type&YLOptionsRight);}}

方法调用

[self optionsDemo:YLOptionsTop|YLOptionsRight];

会有两个打印输出

2018-08-21 13:39:34.750480+0800 Demo[20332:1760218] 上  12018-08-21 13:39:34.750586+0800 Demo[20332:1760218] 右  8

这样就实现了多选功能,多个枚举值 要使用| 或符号

解析方法的调用

方法调用

[self optionsDemo:YLOptionsTop|YLOptionsRight];

这时的type是YLOptionsTop | YLOptionsRight

多选时,用加法来进行枚举的叠加,减法来进行枚举的删除

//多选时,用加法来进行枚举的叠加,减法来进行枚举的删除//根据打印可以知道 type == 9// type 是 top 和 right 相加得来的// 0000 0001 + 0000 1000 = 0000 1001  即为 9-(void)optionsDemo:(YLOptions)type{//根据下面的 按位运算 就可以计算出结果了//1001 & 0001  0001if(type&YLOptionsTop){NSLog(@"上  %ld",type&YLOptionsTop);}//1001 & 0010  0000if(type&YLOptionsBottom){NSLog(@"下  %ld",type&YLOptionsBottom);}//1001 & 0100  0000if(type&YLOptionsLeft){NSLog(@"左  %ld",type&YLOptionsLeft);}//1001 & 1000  1000if(type&YLOptionsRight){NSLog(@"右  %ld",type&YLOptionsRight);}}

也可以这样理解

理解1://1001 & 1000  1000    转成十进制是 8  是>0的  那么  1001 & 1000 是真的,就会有打印输出if(type&YLOptionsRight){NSLog(@"右  %ld",type&YLOptionsRight);}理解2:(type&YLOptionsRight)与 的 二进制值是1000对应的枚举值是 YLOptionsRight    这样写 会清晰一些if((type&YLOptionsRight)==YLOptionsRight){NSLog(@"右  %ld",type&YLOptionsRight);}

3.按位运算

按位与 &运算 :

1 & 1 = 1  1 & 0 = 0  0 & 0 = 0总结规则:有0则为0 即:一假则假

按位或 |运算:

1|1=11|0=10|0=0总结规则:有1则为1即:一真则真

4.二进制的与 、或 运算

举个🌰:

0000 0010和0000 0100相或 和 相与

二进制的与或运算,是每一位的对比运算,而不是总体所代表的值的对比运算

1.0000 0010|0000 0100

根据上面的按位运算, 前四位都是0  咱简单的只对比后四位

0010按位运算符0100结果

第一位0或00

第二位0或11

第三位1或01

第四位0或00

结果就是0110

这样就可以看出 之前说的 传参是YLOptionsTop | YLOptionsRight,为什么type的结果是9了

2.0000 0010&0000 0100

0010按位运算符0100结果

第一位0与00

第二位0与10

第三位1与00

第四位0与00

结果是0000

相关文章

  • iOS NS_OPTIONS 位移枚举

    『前言』 枚举值是一个整形(int),并且它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化.在代码中...

  • iOS NS_OPTIONS 位移枚举

    『前言』 枚举值是一个整形(int),并且它不参与内存的占用和释放,枚举定义变量即可直接使用,不用初始化.在代码中...

  • iOS 枚举 NS_OPTIONS和enum 位移枚举和枚举

    1. NS_OPTIONS是个什么的东西 基本概念 << 位运算 2进制中所有的bit向左移动 & 运算 | 运算...

  • iOS中NS_OPTIONS 位移枚举详解

    OC中NS_OPTIONS的使用 OC 常用的枚举有两种类型,分别是 NS_ENUM 和 NS_OPTIONS ,...

  • iOS开发 枚举类型NS_ENUM和NS_OPTIONS的区别

    NS_ENUM通用枚举值 NS_OPTIONS位移相关操作的枚举值 通常情况下我们用的枚举是NS_ENUM 当一个...

  • 位移枚举NS_OPTIONS详解

    位运算知识简介 按位与&对应的两个二进制位均为1时,结果位才为1,否则为0(与1相&就保持原位,与0相&就为0)举...

  • iOS枚举(位移枚举)

    什么是枚举 在程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不直观,易读性差。如果能在程序中用自然语言...

  • iOS位移枚举

    位移枚举 目录 问题引入 问题解析 概念讲解 问题解决办法(位移枚举) 优化方法 问题引入 假定有一项考试,考试内...

  • iOS 位移枚举

    待完成 每一天坚持学习

  • iOS之规范1

    iOS之规范1 参考链接:参考1,参考2,参考3 枚举类型 枚举推荐使用NS_ENUM和NS_OPTIONS宏定义...

网友评论

      本文标题:iOS NS_OPTIONS 位移枚举

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