2020年11月20日
川俣晶の縁側ソフトウェアC# コーディング How To total 950 count

【入門級】別の機能で同じ結果を得る

Written By: 川俣 晶連絡先

 別の機能で同じ結果を得られる場合があります。

 たとえば、a*2はa+aと書いても同じです。

 わざわざa+aなどとは書くはずがないと思うかも知れませんが、他の要素と複合したときにその方が短く書ける状況があります。

 同じように、1左ビットシフトさせても2倍に相当する結果が得られます。

 他にも、以下のような組み合わせがあります。

  • 論理否定演算子は-1とのXORと同じ
  • 2で割った余りをえることは、1とANDを取ることと同じ
  • ある値を代入することと、その値の回数だけ1を足すことと同じ

罠の数々 §

  • 同じ結果を出す組み合わせでも、細部の振る舞い、制限事項まで同じわけではないので、書き換えて良いかは慎重に
  • 同じ結果を出す組み合わせによる効率アップは、コンパイラの最適化もやってくれる。より良い書き換えが常により良い結果につながるわけではない

参考リンク §

ビットごとの演算子とシフト演算子 (C# リファレンス)

算術演算子 (C# リファレンス)

 なぜ同じ結果を出す方法が存在するのだろうか。それは無駄ではないだろうか。上記のリンクから辿って個々の演算子の機能を調べ、なぜ同じ結果を出す方法があるのか考えてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

TwoWay §

using System;

class Program

{

    static void Main()

    {

        int a = 1234;

        int a1 = a*2;

        int a2 = a+a;

        int a3 = a << 1;

        Console.WriteLine("結果は同じ");

        Console.WriteLine($"a * 2 = {a1}");

        Console.WriteLine($"a + a = {a2}");

        Console.WriteLine($"a << 1 = {a3}");

        int b = 1234;

        int b1 = ~b;

        int b2 = b ^ -1;

        Console.WriteLine("結果は同じ");

        Console.WriteLine($"~b = {b1}");

        Console.WriteLine($"b ^ -1 = {b2}");

        int c = 1234;

        int c1 = c % 2;

        int c2 = c & 1;

        Console.WriteLine("結果は同じ");

        Console.WriteLine($"c % 2 = {c1}");

        Console.WriteLine($"c & 1 = {c2}");

        int d = 1234;

        int d1 = d;

        int d2 = 0;

        for (int i = 0; i < d; i++)

        {

            d2++;

        }

        Console.WriteLine("結果は同じ");

        Console.WriteLine($"by assign = {d1}");

        Console.WriteLine($"by loop = {d2}");

    }

}

実行結果

結果は同じ

a * 2 = 2468

a + a = 2468

a << 1 = 2468

結果は同じ

~b = -1235

b ^ -1 = -1235

結果は同じ

c % 2 = 0

c & 1 = 0

結果は同じ

by assign = 1234

by loop = 1234

COOL C# CREW

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

C#ハウツー: 逆引き入門・こんな機能はどう書くの?