カーネルコードを読んでいて、ある場所でif
ステートメント内に次のような式を見たことがあります。
if (value == (SPINLOCK_SHARED | 1) - 1) {
............
}
どこ SPINLOCK_SHARED = 0x80000000
は事前定義された定数です。
なぜ必要なのか(SPINLOCK_SHARED | 1) - 1
-型変換のため?式の結果は80000000になります-0x80000000と同じですよね?それでも、なぜORing 1とSubtracting 1が重要なのですか?
何かを手に入れられないような気がします。
このような方法は、いくつかの追加ケースを処理するために行われます。たとえば、この場合、SPINLOCK_SHARED
は1にはできません。
int SPINLOCK_SHARED = 0x01
int res = (SPINLOCK_SHARED | 1) - 1 // 0