Search code examples
objective-coperation

What is operation in enum type?


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

Solution

  • 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.