2020年09月21日
川俣晶の縁側ソフトウェアC# コーディング How Tototal 961 count

【入門級】XOR演算子の出番

Written By: 川俣 晶連絡先

こんなメソッドを書いてみよう §

 以下のようなメソッドを書いてみよう。

  • bool型の引数を2つ取る
  • 一つ目は有効無効の指定 isEnabled
  • 二つ目は値 flag
  • isEnabledがtrueならflagの値を反転してConsole.WriteLineで出力する

普通に書くと §

 普通にifを使って書くと、サンプルソースのsub1のようになります。

 しかし、機能に比してちょっと長いですね。論理反転の演算子などを使うともっと短くできそうです。

XOR(排他的論理和)で書くと §

 これはサンプルソースのsub2のように書いても等価です。

 なぜでしょうか。

 XOR(排他的論理和)は、【どちらか1つだけtrueなら結果はtrue】になる演算子です。

 しかし、これを【第1の値がtrueなら第2の値を反転させる。falseなら反転させない演算子】と読み替えると、今回のお題にピッタリだと分かります。

 実はifも反転演算子も必要ありません。

 論理の不思議ですね。

罠の数々 §

  • XORは便利だが、使える場面は多くない。過剰な期待はしない方が良い
  • むしろ、XORの出番を作るためにあえてXORで便利に処理できるようにデータ構造を定義しても良い (それでコード全体がコンパクトになるなら必ずしも悪いことではない)
  • しかし、XORを多用すると【分かりにくいソースだ】と怒られるリスクもある

参考リンク §

メンバー アクセス演算子と式 (C# リファレンス)

ブール論理演算子 (C# リファレンス)

 Visual Studioで^にキャレットを置いてF1を押すと【メンバー アクセス演算子と式】のページが開いてしまうが、ここで使っているのはその【^ (末尾からのインデックス)】ではない。実際はブール論理演算子の【 ^ (論理排他的 OR) 演算子】の方である。間違えないように注意しよう。^は文脈によって意味が変わるのである。上記のリンクをクリックして違いを確認しておこう。

リポジトリ §

https://github.com/autumn009/cshowto

xor §

using System;

class Program

{

    private static void sub1(bool isEnabled, bool flag)

    {

        if( isEnabled)

        {

            if (flag) flag = false; else flag = true;

        }

        Console.WriteLine(flag);

    }

    private static void sub2(bool isEnabled, bool flag)

    {

        Console.WriteLine(isEnabled ^ flag);

    }

    static void Main()

    {

        sub1(false, true);

        sub1(true, true);

        sub2(false, true);

        sub2(true, true);

    }

}

実行結果

True

False

True

False

Facebook

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?
キーワード【 川俣晶の縁側ソフトウェアC# コーディング How To
【C# コーディング How To】の次のコンテンツ
2020年
09月
22日
【入門級】ファイルのフルパスを示す文字列の作り方
3days 0 count
total 1191 count
【C# コーディング How To】の前のコンテンツ
2020年
09月
20日
【入門級】平均値を計算するAverageメソッドは必ずしも速くない
3days 0 count
total 928 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20200921093317
サイトの表紙【C# コーディング How To】の表紙【C# コーディング How To】のコンテンツ全リスト 【C# コーディング How To】の入手全リスト 【C# コーディング How To】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.