web-dev-qa-db-ja.com

(x | y)-yなぜ単純にxまたは `x | 0`

カーネルコードを読んでいて、ある場所でifステートメント内に次のような式を見たことがあります。

if (value == (SPINLOCK_SHARED | 1) - 1) {
         ............
}

どこ SPINLOCK_SHARED = 0x80000000は事前定義された定数です。

なぜ必要なのか(SPINLOCK_SHARED | 1) - 1-型変換のため?式の結果は80000000になります-0x80000000と同じですよね?それでも、なぜORing 1とSubtracting 1が重要なのですか?

何かを手に入れられないような気がします。

47
RaGa__M

このような方法は、いくつかの追加ケースを処理するために行われます。たとえば、この場合、SPINLOCK_SHAREDは1にはできません。

int SPINLOCK_SHARED = 0x01

int res = (SPINLOCK_SHARED | 1) - 1 // 0
0
funnydman