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

それはビットごとのシフト操作です。列挙型から 1 つ以上のフラグを設定できるようにするために使用されます。この回答には適切な説明があります: なぜ C 列挙型定義の値に Bitwise-Shift 演算子を使用するのですか?

基本的には、1 つの整数に複数のフラグを格納できるようにするためのもので、2 項 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 に答える