0 なら 1 に、1 なら 0 にする | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

ある整数型の変数には 0 か 1 の値が入ります。その変数の現在の値が 0 だったら 1 に、現在の値が 1 だったら 0 にしたいとします。

もしこの変数の目的が「真」か「偽」かをあらわすものであるなら、_Bool型(第13章)を使って意味を明確にしましょう。0 と 1 の反転には論理否定演算子を使います。

方法①(条件分岐を使う)

もっともシンプルな方法ですが、条件分岐は効率面で劣る可能性があります。

#include <stdio.h>

int main(void)
{
    int num = 0;

    if (num == 0) {
        num = 1;
    }
    else {
        num = 0;
    }
    printf("%d\n", num);

    num = (num == 0) ? 1 : 0;
    printf("%d\n", num);
}

実行結果:

1
0

if文を使っても、条件演算子を使っても構いませんが、条件演算子のほうがシンプルそうです。

この実装例では、変数num の値が 0 でも 1 でもない場合には 0 になります。

方法②(減算を利用する)

減算だけで実現できます。

#include <stdio.h>

int main(void)
{
    int num = 0;

    num = 1 - num;
    printf("%d\n", num);

    num = 1 - num;
    printf("%d\n", num);
}

実行結果:

1
0

1 - num という式は、num の値が 0 のときは 1 - 0 なので 1 になり、num の値が 1 のときは 1 - 1 なので 0 になります。

num に 0 でも 1 でもない値が入ることがないように注意してください。

方法③(ビット演算を利用する)

ビット演算でも実現できます。

#include <stdio.h>

int main(void)
{
    int num = 0;

    num ^= 1;
    printf("%d\n", num);

    num ^= 1;
    printf("%d\n", num);
}

実行結果:

1
0

ビット単位排他的論理和(第49章)を使っています。

ビット単位排他的論理和は、2つのオペランドのビットを比較して、同じだったら 0 に、異なっていたら 1 になるビット演算です。そのため、num ^= 1 では、num の値が 0 のときは、0 と 1 は異なるため 1 になり、num の値が 1 のときは、1 と 1 は同じなので 0 になります。

num に 0 でも 1 でもない値が入ることがないように注意してください。

なお、ビット単位排他的論理和のようなビット演算では、符号付き整数型を使うとトラブルが起きる可能性があるとされます(第49章)。これは最上位ビットが符号を表していると、それを書き換えてしまう恐れがあるためです。しかし、変数num が 0 か 1 にしかなり得ないのであれば問題にはなりません。


参考リンク


更新履歴



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る