operator<<
は ビットごとの左シフト演算子です。指定された回数だけすべてのビットを左にシフトします: (算術左シフトおよび予約符号ビット)
m << n
toのすべてのビットを何度もm
左にシフトしますn
。( 1 つのシフト == 2 倍することに注意してください)。
1 << 0
シフトがないことを意味するので、それは only に等しいです1
。
1 << 1
は1シフトを意味するため、1*2
= 2 のみに等しくなります。
1 バイトで説明します。1 バイトに 1 つは次のようなものです。
MSB
+----+----+----+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1
+----+----+----+---+---+---+---+---+
7 6 5 4 3 2 1 / 0
| / 1 << 1
| |
▼ ▼
+----+----+----+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2
+----+----+----+---+---+---+---+---+
7 6 5 4 3 2 1 0
一方1 << 0
、図1のように何もしません。(符号を保持するために 7 番目のビットがコピーされることに注意してください)
OR 演算子: ビットごとに or を実行
MSB PKRevealControllerTypeLeft
+----+----+----+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | == 1
+----+----+----+---+---+---+---+---+
7 6 5 4 3 2 1 0
| | | | | | | | OR
MSB PKRevealControllerTypeRight
+----+----+----+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | == 2
+----+----+----+---+---+---+---+---+
7 6 5 4 3 2 1 0
=
MSB PKRevealControllerTypeBoth
+----+----+----+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | == 3
+----+----+----+---+---+---+---+---+
7 6 5 4 3 2 1 0
|
ビット単位の演算子です。以下のコードではor
1 | 2
==3
PKRevealControllerTypeNone = 0, // is Zero
PKRevealControllerTypeLeft = 1 << 0, // one
PKRevealControllerTypeRight = 1 << 1, // two
PKRevealControllerTypeBoth = (PKRevealControllerTypeLeft |
PKRevealControllerTypeRight) // three
このような初期化された値には、これ以上技術的な理由はありません。そのように定義すると、物事がうまく整列します。この回答を読んでください: define SOMETHING (1 << 0)
コンパイラの最適化のようにそれらをより簡単に変換します:( 3番目のものについてはわかりませんが、コンパイラもそれを最適化すると思います)
PKRevealControllerTypeNone = 0, // is Zero
PKRevealControllerTypeLeft = 1, // one
PKRevealControllerTypeRight = 2, // two
PKRevealControllerTypeBoth = 3, // Three
編集: @Till に感謝します。この回答を読むBOOL フラグを使用したアプリの状態は、ビットごとの演算子を使用して取得した宣言の有用性を示しています。