typedef枚举语法如'1 << 0'是什么意思?

这个问题在这里已经有了答案:

  • 什么是位移(位移)操作符,它们是如何工作的? 8个答案

  • 这对C语言家族来说很常见,并且在C,C ++和Objective-C中的工作方式相同。 与Java,Pascal和类似语言不同,C枚举不限于为其命名的值; 它实际上是一个可以表示所有命名值的整数类型的大小,并且可以将枚举类型的变量设置为枚举成员中的算术表达式。 通常,使用位移来使值的幂为2,并且使用按位逻辑操作来组合值。

    typedef enum {
       read    = 1 << 2,  // 4
       write   = 1 << 1,  // 2
       execute = 1 << 0   // 1
    } permission;  // A miniature version of UNIX file-permission masks
    

    再次,移位操作全部来自C.

    你现在可以写:

    permission all = read | write | execute;
    

    您甚至可以在权限声明本身中包含该行:

    typedef enum {
       read    = 1 << 2,  // 4
       write   = 1 << 1,  // 2
       execute = 1 << 0,  // 1
       all     = read | write | execute // 7
    } permission;  // Version 2
    

    你如何打开一个文件的execute

    filePermission |= execute;
    

    请注意,这是危险的:

    filePermission += execute;
    

    这会将价值all改变为8 ,这是没有意义的。


    <<被称为左移运算符。

    http://www.techotopia.com/index.php/Objective-C_Operators_and_Expressions#Bitwise_Left_Shift

    长话短说1 << 0 = 1 1 << 1 = 2 1 << 2 = 4 1 << 3 = 8


    它看起来像typedef代表一个位字段值。 1 << n1左移n位。 所以每个enum项代表一个不同的位设置。 该特定的位设置或清除将指示某种状态是两种状态之一。 1左移零位为1

    如果声明了数据:

    CMAttitudeReferenceFrame foo;
    

    然后,您可以使用enum值检查四个独立状态中的任何一个,并且foo不大于int 。 例如:

    if ( foo & CMAttitudeReferenceFrameXArbitraryCorrectedZVertical ) {
        // Do something here if this state is set
    }
    
    链接地址: http://www.djcxy.com/p/12567.html

    上一篇: What does typedef enum syntax like '1 << 0' mean?

    下一篇: Why is 3<<1 == 6 in python?