Вопрос

What is:

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

In the example below

typedef enum {
   NSStreamEventNone = 0,
   NSStreamEventOpenCompleted = 1 << 0,
   NSStreamEventHasBytesAvailable = 1 << 1,
   NSStreamEventHasSpaceAvailable = 1 << 2,
   NSStreamEventErrorOccurred = 1 << 3,
   NSStreamEventEndEncountered = 1 << 4
};
Это было полезно?

Решение

That's a bitwise shift operation. It is used so that you can set one or more flags from the enum. This answer has a good explanation: Why use the Bitwise-Shift operator for values in a C enum definition?

Basically, it's so that one integer can store multiple flags which can be checked with the binary AND operator. The enum values end up looking like this:

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

So you can say:

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

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

If you didn't have the binary shift, the values could clash or overlap and the technique wouldn't work. You may also see enums get set to 0, 1, 2, 4, 8, 16, which is the same thing as the shift above.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top