2021年08月04日 更新
どうも、クラゲジュニアです。
条件文でのビット否定の使い方についてです。
ビット否定は、~で表します。
挙動としては、ビットの状態を反転させるものです。
n = 5 // (1)
n = ~n // (2)
printf("%d\n", n); // -6
この時、(1)・(2)のそれぞれのビットの状態は以下のようになります。
32bit ・ 2進数
(1) 00000000000000000000000000000101
(2) 11111111111111111111111111111010 // 2の補数表現
ビットを見てわかるように、反転すると1と0が反転します。
例として以下のコードを使います。
以下のコードは、標準入力から数値を受け取るコードです。
EOFは、読み込みの終了として-1を表しています。
while(scanf("%d", &a) != EOF){ ... }
このコードでは、-1が返ってきた時に、ループを抜けるのが正しい挙動です。
条件文では0をfalse、0以外をtrueと認識します。
つまり、マイナスもtrueに含まれます。
下記のようなコードだと読み込みの終わりをtrueと判定してしまいループを抜けることができません。
while(scanf("%d", &a)){ ... }
そこで、ビット反転を利用します。
-1をビット反転すると2の補数表現で0になるので、以下のように書き換えることが可能です。
while(~scanf("%d", &a)){ ... }
メリットとして少しコードをスッキリさせることができます。
以上です。