What does typedef enum syntax like '1 << 0' mean?
本问题已经有最佳答案,请猛点这里访问。
我对C和C++的TyWulf EnUM语法有些熟悉。我现在用Objective-C编程,在下面的示例中遇到了语法。我不确定语法是否是特定于C的客观语法。但是,我的问题是在下面的代码片段中,像
1 2 3 4 5 6 | typedef enum { CMAttitudeReferenceFrameXArbitraryZVertical = 1 << 0, CMAttitudeReferenceFrameXArbitraryCorrectedZVertical = 1 << 1, CMAttitudeReferenceFrameXMagneticNorthZVertical = 1 << 2, CMAttitudeReferenceFrameXTrueNorthZVertical = 1 << 3 } CMAttitudeReferenceFrame; |
这在C语言家族中是常见的,在C、C++和Objtovi.C中都是相同的。C不同于Java、Pascal和类似的语言,C枚举不限于以它命名的值;它实际上是一个可以表示所有命名值的整数类型,并且可以将枚举类型的变量设置为算术表达式。枚举成员。通常,使用位移位使值的幂为2,使用位逻辑操作组合值。
1 2 3 4 5 | typedef enum { read = 1 << 2, // 4 write = 1 << 1, // 2 execute = 1 << 0 // 1 } permission; // A miniature version of UNIX file-permission masks |
同样,位移操作都来自C。
你现在可以写:
1 | permission all = read | write | execute; |
甚至可以在权限声明中包含该行:
1 2 3 4 5 6 | typedef enum { read = 1 << 2, // 4 write = 1 << 1, // 2 execute = 1 << 0, // 1 all = read | write | execute // 7 } permission; // Version 2 |
你怎么打开
1 | filePermission |= execute; |
注意这是危险的:
1 | filePermission += execute; |
这将把值为
http://www.techotopia.com/index.php/objective-c_operators_and_expressions bitwise_left_shift
长篇短文
看起来
如果申报了基准:
1 | CMAttitudeReferenceFrame foo; |
然后您可以使用
1 2 3 | if ( foo & CMAttitudeReferenceFrameXArbitraryCorrectedZVertical ) { // Do something here if this state is set } |