1

什么是:

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
};
4

1 回答 1

1

这是一个位移操作。使用它以便您可以从枚举中设置一个或多个标志。这个答案有一个很好的解释: 为什么对 C 枚举定义中的值使用按位移位运算符?

基本上,一个整数可以存储多个标志,这些标志可以用二元 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,这与上面的转变相同。

于 2013-06-19T13:23:46.857 回答