这是一个位移操作。使用它以便您可以从枚举中设置一个或多个标志。这个答案有一个很好的解释: 为什么对 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
,这与上面的转变相同。