位移枚举NS_OPTIONS详解

位运算知识简介

  • 按位与&
    • 对应的两个二进制位均为1时,结果位才为1,否则为0(与1相&就保持原位,与0相&就为0)
    • 举例:9&5=1
    1001&0101=0001
    
  • 按位或|
    • 对应的两个二进制位有一个为1时,结果位就为1,否则为0
    • 举例:9|5=13
    1001|0101=1101
    
  • 左移<<
    • 把一个数的各个二进位全部左移n位,左移n位其实就是乘以2的n次方
    • 规则:高位丢弃,低位补0,举例说明:当左移的运算数是int 类型时,每移动1位它的第31位就要被丢弃
    • 举例:1<<4=16
    0001<<4=1 0000
    

位移枚举定义

  • 第一个为NSUInteger这个为固定值
  • 第二个为枚举类型
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

位移枚举的作用

  • 可以同时存在多个枚举值(按|计算设置,下面会解释)
  • 举例
self.view.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin
                           | UIViewAutoresizingFlexibleRightMargin
                           | UIViewAutoresizingFlexibleWidth
                           | UIViewAutoresizingFlexibleHeight;
  • 按位运算得出其本质
self.view.autoresizingMask = 1 << 0 | 1 << 2 | 1 << 1 | 1 << 4;
self.view.autoresizingMask = 0 0001 | 0 0100 | 0 0010 | 1 0000;
self.view.autoresizingMask = 0 0101 | 0 0010 | 1 0000;
self.view.autoresizingMask = 0 0111 | 1 0000;
self.view.autoresizingMask = 1 0111;
  • 多枚举配置的使用,其他配置在使用时的判断类似
// 1 0111 & 0 0001 = 0 0001,所以会指定代码逻辑1
if((self.view.autoresizingMask & UIViewAutoresizingFlexibleLeftMargin) == UIViewAutoresizingFlexibleLeftMargin) {
    // 代码逻辑1
}

// 1 0111 & 1 0000 = 1 0000,所以会指定代码逻辑2
if((self.view.autoresizingMask & UIViewAutoresizingFlexibleHeight) == UIViewAutoresizingFlexibleHeight) {
    // 代码逻辑2
}

总结

  • 设置位移枚举按位或|运算
  • 使用位移枚举按位与&运算

参考文章

  • iOS枚举(位移枚举)
  • iOS位运算符在枚举中的应用
  • 位移&二进制转换&原码&反码&补码

你可能感兴趣的:(位移枚举NS_OPTIONS详解)