7

我对 C 和 C++ 的 typedef 枚举语法有些熟悉。我现在正在使用 Objective-C 进行编程,并遇到了以下示例中的语法。我不确定语法是否特定于 Objective-C。但是,我的问题在下面的代码片段中,语法是什么1 << 0意思?

typedef enum {
   CMAttitudeReferenceFrameXArbitraryZVertical = 1 << 0,
   CMAttitudeReferenceFrameXArbitraryCorrectedZVertical = 1 << 1,
   CMAttitudeReferenceFrameXMagneticNorthZVertical = 1 << 2,
   CMAttitudeReferenceFrameXTrueNorthZVertical = 1 << 3
} CMAttitudeReferenceFrame;
4

3 回答 3

13

这在 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;

这会将值更改all8,这是没有意义的。

于 2013-07-27T02:45:57.383 回答
6

<<称为左移运算符。

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

长话短说1 << 0 = 1,和。1 << 1 = 2_1 << 2 = 41 << 3 = 8

于 2013-07-27T02:21:03.320 回答
3

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

如果声明了一个数据:

CMAttitudeReferenceFrame foo;

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

if ( foo & CMAttitudeReferenceFrameXArbitraryCorrectedZVertical ) {
    // Do something here if this state is set
}
于 2013-07-27T02:20:33.253 回答