关于objective c:typedef枚举语法如1<<0

What does typedef enum syntax like '1 << 0' mean?

本问题已经有最佳答案,请猛点这里访问。

我对C和C++的TyWulf EnUM语法有些熟悉。我现在用Objective-C编程,在下面的示例中遇到了语法。我不确定语法是否是特定于C的客观语法。但是,我的问题是在下面的代码片段中,像1 << 0这样的语法意味着什么?

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

你怎么打开execute打开文件?

1
filePermission |= execute;

注意这是危险的:

1
filePermission += execute;

这将把值为all的东西改为8,这毫无意义。


<<称为左移位运算符。

http://www.techotopia.com/index.php/objective-c_operators_and_expressions bitwise_left_shift

长篇短文1 << 0 = 11 << 1 = 21 << 2 = 41 << 3 = 8


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

如果申报了基准:

1
CMAttitudeReferenceFrame foo;

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

1
2
3
if ( foo & CMAttitudeReferenceFrameXArbitraryCorrectedZVertical ) {
    // Do something here if this state is set
}