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)){ ... }

メリットとして少しコードをスッキリさせることができます。

以上です。