美文网首页
02-02、位运算和枚举

02-02、位运算和枚举

作者: 山中石头 | 来源:发表于2017-10-09 14:16 被阅读0次

我看iOS本身定义的枚举里面经常会使用左移(<<)来定义枚举的值,一开始我还不懂为啥要这么定义。这么处理的逻辑跟iOS系统没关系。

1、举个例子

定义:

typedef enum{
a = 1 << 0,
b = 1 << 1,
c = 1 << 2,
d = 1 << 3
}testEnum;

使用:

testEnum e = a | b;

if (e & a) {
    printf("满足条件a");
    //满足a要做的事
}
if (e & b) {
    printf("满足条件b");
    //满足b要做的事
}
if (e & c) {
    printf("满足条件c");
    //满足c要做的事
}

为什么枚举值定义成1左移n位的形式呢?看枚举值的二进制形式:

1 << 0 是00000001
1 << 1 是00000010
1 << 2 是00000100
规律就是只有一个位上为1,但其他为都为0.这样 e = a | b,二进制形式就是00000011,然后e & b的时候,因为位与(&)的性质,只有都为1才会是1,这样e & a和e & b都会有值,不是0,也就为true。

用移位来定义枚举就是为了把1的位置错开,然后当你需要同时满足多个枚举值的时候,可以使用位或(|)操作把多个枚举值合并,而不会互相影响。比如 00010000 和 00100000合并,他们的1位置是错开的,合并之后1的位置都保留下来了,变成00110000. 然后使用位与(&)来检测某个位上的1,因为每个枚举值只有一个位上是1,除非你的位上也是1,否则位与操作后就为0了。比如0010000和00010000位与就为0;而00100000和00110000位与就不是0。而前面位或操作又可以把每个枚举值的1都保留了,所以后面位与操作会把它包含的每个枚举值都体现出来。

也就是如果e = a| b | c | d,那么e & a 、e & b 、e & c 、 e & d都为true.就是你这个枚举值包含了那些原始枚举值,&操作值都为true.这样代码写起来,逻辑就符合人的思维了。

不知道这个是不是常识,我大学不是计算机专业,也没人跟我专门讲过这个。

相关文章

  • 02-02、位运算和枚举

    我看iOS本身定义的枚举里面经常会使用左移(<<)来定义枚举的值,一开始我还不懂为啥要这么定义。这么处理的逻辑跟i...

  • 位运算和枚举

    我看iOS本身定义的枚举里面经常会使用左移(<<)来定义枚举的值,一开始我还不懂为啥要这么定义。这么处理的逻辑跟i...

  • 位运算与位枚举

    位运算与位枚举

  • iOS 位枚举

    在 iOS 开发中,我们使用系统的枚举定义的时候,经常可以看到位枚举: 需要掌握位枚举,我们需要先了解位运算 和 ...

  • 2020-07-01【c#】枚举的位运算 & LayerMask

    枚举的位运算 1.先通过|运算符,获得一个合并的集合结果2.将这个结果,通过和某个枚举值的&运算,进行比较判断,由...

  • c枚举,位运算

  • iOS-枚举类型为什么要用<<

    在枚举中我们经常看到<<这样的位运算符。如果我们在枚举中看到<<那我们就可以通过|(位运算符:或)进行组合使用: ...

  • C#枚举

    下面的实例演示了枚举变量的用法 当上面的代码被编译和执行时,它会产生下列结果: 简单枚举 标志枚举这种位运算是非常...

  • swift中的枚举使用问题

    在OC中,当遇到可以进行位运算的枚举值时,可以使用|(或运算符组合多个枚举值) 比如这种类型NSStringDra...

  • 10、枚举与闭包

    枚举 枚举和普通类相比有什么优势 枚举类型、枚举名称与枚举值 枚举的比较运算 两个枚举之间可以使用等值比较(==)...

网友评论

      本文标题:02-02、位运算和枚举

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