このページの解説は C99 をベースとしています。
以下は目次です。
ある整数型📘の変数には 0 か 1 の値が入ります。その変数の現在の値が 0 だったら 1 に、現在の値が 1 だったら 0 にしたいとします。
もしこの変数の目的が「真」か「偽」かをあらわすものであるなら、_Bool型(第13章)を使って意味を明確にしましょう。0 と 1 の反転には論理否定演算子を使います。
もっともシンプルな方法ですが、条件分岐は効率面で劣る可能性があります。
#include <stdio.h>
int main(void)
{
int num = 0;
if (num == 0) {
= 1;
num }
else {
= 0;
num }
("%d\n", num);
printf
= (num == 0) ? 1 : 0;
num ("%d\n", num);
printf}
実行結果:
1
0
if文を使っても、条件演算子📘を使っても構いませんが、条件演算子のほうがシンプルそうです。
この実装例では、変数num の値が 0 でも 1 でもない場合には 0 になります。
減算だけで実現できます。
#include <stdio.h>
int main(void)
{
int num = 0;
= 1 - num;
num ("%d\n", num);
printf
= 1 - num;
num ("%d\n", num);
printf}
実行結果:
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;
^= 1;
num ("%d\n", num);
printf
^= 1;
num ("%d\n", num);
printf}
実行結果:
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 にしかなり得ないのであれば問題にはなりません。
return 0;
を削除(C言語編全体でのコードの統一)
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |