ループ処理の中などで特定の変数を0と1交互に変化させたい。
0 -> 1 -> 0 -> 1 ...
【追記】簡単な例
すぽっくさんから本記事に頂いたコメントにあった以下の式を使う方法です。
key = 1 - key;
こちらの方が後述の排他的論理和を使う方法よりシンプルで分かりやすいです。
サンプルコード
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i;
int key = 0;
for(i=0; i<10; i++){
printf("%d\n", key);
key = 1 - key;
}
return 0;
}
実行結果
0 1 0 1 0 1 0 1 0 1
小面倒な例(わたしの考えた方法)
ビット演算子の排他的論理和(XOR)である ^ を利用して次のようにすれば実現できる。
key ^= 1;
サンプルコード
flip_flop.c
/*
flip_flop.c
変数で 0 -> 1 -> 0 -> 1 ... を実現したい
*/
#include <stdio.h>
int main(void)
{
char key = 0;
int i;
for(i=0; i<10; i++){
printf("key = %d\n", key);
key ^= 1;
}
return 0;
}
実行結果
key = 0 key = 1 key = 0 key = 1 key = 0 key = 1 key = 0 key = 1 key = 0 key = 1
考え方
排他的論理和(XOR)のビット演算がポイントです。
例えば2進数1桁(1ビット)を表すaとbがあったとします。
a ^ b の演算表はこうなります。
a | b | 結果 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
双方が同じ値(0と0又は1と1)の場合、0。
双方が違う値(1と0又は0と1)の場合、1。
となるのが排他的論理和です。
上記サンプルコードを例にとると
変数keyの初期値は 0 。
char型は1バイト(=8ビット)変数なので、ビットに直すと
となります。
次に key ^= 1; の式。
これは、省略式なので実際の意味は、 key = key ^ 1;
この式の計算内容もビットに直します。
変数keyの値が0から1に変化します。
再度この key ^= 1; を実行します。
変数keyが元の値0に戻ります。
式 key ^= 1; だけで 0 -> 1 -> 0 -> 1 を実現しているわけです。
面白いですね。
以上、C言語でフリップフロップ回路みたいな 0->1->0->1… を実現したいでした。
コメント
私はずっと
key = 1-Key
を使ってます。
管理人です。すぽっくさんの
key = 1 - key;
のコードの方がずっとシンプルで分かりやすいですね。
勉強になりました!
【補足】合わせて記事に追記させて頂きました。ありがとうございました。