enum类型的操作是什么?

时间:2013-06-19 13:17:27

标签: objective-c operation

什么是:

NSStreamEventOpenCompleted = 1 << 0 ,  1 << 1  , 1 << 2 , 1 << 3 , 1 << 4 ?

在下面的例子中

typedef enum {
   NSStreamEventNone = 0,
   NSStreamEventOpenCompleted = 1 << 0,
   NSStreamEventHasBytesAvailable = 1 << 1,
   NSStreamEventHasSpaceAvailable = 1 << 2,
   NSStreamEventErrorOccurred = 1 << 3,
   NSStreamEventEndEncountered = 1 << 4
};

1 个答案:

答案 0 :(得分:1)

这是bitwise shift操作。它用于您可以从枚举中设置一个或多个标志。这个答案有一个很好的解释:Why use the Bitwise-Shift operator for values in a C enum definition?

基本上,一个整数可以存储多个标志,可以使用二进制AND运算符进行检查。枚举值最终看起来像这样:

typedef enum {
   NSStreamEventNone = 0,                      // 00000
   NSStreamEventOpenCompleted = 1 << 0,        // 00001
   NSStreamEventHasBytesAvailable = 1 << 1,    // 00010
   NSStreamEventHasSpaceAvailable = 1 << 2,    // 00100
   NSStreamEventErrorOccurred = 1 << 3,        // 01000
   NSStreamEventEndEncountered = 1 << 4        // 10000
};

所以你可以说:

// Set two flags with the binary OR operator
int flags =   NSStreamEventEndEncountered | NSStreamEventOpenCompleted  // 10001

if (flags & NSStreamEventEndEncountered) // true 
if (flags & NSStreamEventHasBytesAvailable) // false 

如果您没有二进制移位,则值可能会发生冲突或重叠,并且该技术不起作用。您可能还会看到枚举设置为0, 1, 2, 4, 8, 16,这与上面的转换相同。