実行するごとにオンとオフを切り換えるコードは書けるでしょうか。
bool型の変数の内容をTrueならFalse, FalseならTrueにするなら否定演算子!を使うだけで可能です。
数値の0と1を切り換えるのはXOR演算子^を使えば簡単ですが、これはビットの意味が分かっていないと使えません。
ハードルが高いと思ったら剰余演算子%を使って【+1して2で割った余りを得る】という方法でも構いません。少し回りくどい処理になりますが、これで【0なら1、1なら0】を得るという機能になってくれます。これが2を返すことはありません。2で割ったあまりは0か1だからです。
罠の数々 §
- 無限に0と1を繰り返す数を得る方法はこれだけではない。たとえば通し番号を2で割った余りを得ると、それも0と1を繰り返すことになる。実現方法はいろいろある! 工夫次第だ!
参考リンク §
ブール論理演算子 (C# リファレンス)
メンバー アクセス演算子と式 (C# リファレンス)
算術演算子 (C# リファレンス)
Visual Studioで^にキャレットを置いてF1キーを押すと【メンバー アクセス演算子と式 (C# リファレンス)】のページに連れて行かれるが、実はここで使っている^演算子の説明は【ブール論理演算子 (C# リファレンス)】のページにある。上記のリンクを辿って正しい説明はどちらか確認しておこう。C#は文脈から識別できるとき、同じ名前に別の意味を定義しているケースがあるので、注意しよう。
リポジトリ §
https://github.com/autumn009/cshowto
OnOff §
using System;
class Program
{
static void Main()
{
// 否定法
bool switch1 = false;
for (int i = 0; i < 20; i++)
{
switch1 = !switch1;
Console.Write(switch1 ? "[OFF]" : "[ON]");
}
Console.WriteLine();
// XOR法
int switch2 = 0;
for (int i = 0; i < 20; i++)
{
switch2 = switch2 ^ 1;
Console.Write($"[{switch2}]");
}
Console.WriteLine();
// 剰余法
int switch3 = 0;
for (int i = 0; i < 20; i++)
{
switch3 = (switch3 + 1) % 2;
Console.Write($"[{switch3}]");
}
Console.WriteLine();
}
}
実行結果
[OFF][ON][OFF][ON][OFF][ON][OFF][ON][OFF][ON][OFF][ON][OFF][ON][OFF][ON][OFF][ON][OFF][ON]
[1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0]
[1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0][1][0]