2020年11月20日
川俣晶の縁側ソフトウェアC# コーディング How Tototal 213 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

Facebook

COOL C# CREW

キーワード【 川俣晶の縁側ソフトウェアC# コーディング How To
【C# コーディング How To】の次のコンテンツ
2020年
11月
21日
【入門級】例外を自作する
3days 71 count
total 197 count
【C# コーディング How To】の前のコンテンツ
2020年
11月
19日
【入門級】数値の右路添えと左揃え
3days 2 count
total 187 count

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

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

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

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

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

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

管理者: 川俣 晶連絡先

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