Developer

【初心者Unity】基本的なC#演算子のまとめ その2(ビット・代入・三項・優先順位・結合規則)
2022.01.27
Lv1

【初心者Unity】基本的なC#演算子のまとめ その2(ビット・代入・三項・優先順位・結合規則)

1.はじめに

本記事では、C#における演算子について解説していきます。
演算子全てを取り上げると長大になってしまうので、代表的なものだけピックアップしていきます。

【初心者Unity】基本的なC#演算子のまとめ その1(算術・等値・比較・論理)
➡【初心者Unity】基本的なC#演算子のまとめ その2(ビット・代入・三項・優先順位・結合規則)

2.ビット演算子・シフト演算子

ビット演算子・シフト演算子はビット演算を行う演算子です。
シフト演算子はレイヤーマスクの指定に使用しますので、しっかりと挙動を理解しておきましょう。
ビット演算子は、あまり使用機会が多くないかもしれませんが、フラグの管理(ビットフラグ)等に使用できます。

演算子 名称 使用例 説明
~ ビットごとの補数演算子 ~x xの各ビットを反転させます
<< 左シフト演算子 x << n xをnビット左にシフトします
>> 右シフト演算子 x >> n xをnビット右にシフトします
& 論理AND演算子 x & y xとyの論理積を求めます
| 論理OR演算子 x | y xとyの論理和を求めます
^ 論理排他的OR演算子 x ^ y xとyの排他的論理和を求めます

具体例

uint x = 0b_1111_1111_1111_1111_0000_0000_0000_0001;

// ビットごとの補数演算子
// 各ビットが反転
Debug.Log(Convert.ToString(~x, 2)); // 00000000000000001111111111111110(先頭の0...は表示されません)

// 左シフト演算子
// 指定した桁数左にシフトする
// 上位(左側)の桁は破棄され、下位(右側)の桁は0でパディングされる
Debug.Log(Convert.ToString(x << 15, 2)); // 10000000000000001000000000000000

// 右シフト演算子
// 指定した桁数右にシフトする
// 下位(右側)の桁は破棄され、上位(左側)の桁は0でパディングされる
Debug.Log(Convert.ToString(x >> 15, 2)); // 00000000000000011111111111111110(先頭の0...は表示されません)

uint y = 0b_0000_0000_0000_0000_1111_1111_1111_1111;

// 論理AND演算子
Debug.Log(Convert.ToString(x & y, 2)); // 00000000000000000000000000000001(先頭の0...は表示されません)

// 論理OR演算子
Debug.Log(Convert.ToString(x | y, 2)); // 11111111111111111111111111111111

// 論理排他的OR演算子
Debug.Log(Convert.ToString(x ^ y, 2)); // 11111111111111111111111111111110

3.代入演算子・複合代入演算子

代入演算子は、変数等にデータを格納するための演算子です。
複合代入演算子は、演算と代入を一つの演算子にまとめたものです。

演算子 名称 使用例 説明
= 代入演算子 x = y xにyを代入します
op= 複合代入演算子 x op= y xとyでopの演算を行った結果をxに代入します
opには算術・論理・ビット・シフト演算子が入ります。

具体例

int x = 1;

// 加算複合代入演算子
x += 1;
Debug.Log(x); // 2

// 減算複合代入演算子
x -= 1;
Debug.Log(x); // 1

// 論理AND複合代入演算子
x &= 0;
Debug.Log(x); // 0

// 論理OR複合代入演算子
x |= 1;
Debug.Log(x); // 1

// 左シフト複合代入演算子
x <<= 1;
Debug.Log(Convert.ToString(x, 2)); // 00000000000000000000000000000010(先頭の0...は表示されません)

// 右シフト複合代入演算子
x >>= 1;
Debug.Log(Convert.ToString(x, 2)); // 00000000000000000000000000000001(先頭の0...は表示されません)

4.三項条件演算子

三項条件演算子は、条件式を評価し、その結果によって実行する処理を分岐させる演算子です。
if-else文と同様のフローを、演算子で実装できます。
縦長になってしまうif-else文の記述を可読性を高めて記述できる利点があります。

if文についての詳細はこちらの記事をご参照ください。
【初心者Unity】条件分岐をしよう!(if文)

演算子 名称 使用例 説明
?: 三項条件演算子 x ? y : z xがtrueならばyを、falseならばzを実行します

具体例

int x = 1;

// xが0より大きいならばインクリメント
Debug.Log(x > 0 ? ++x : --x); // 2

x = -1;

// xが0より小さいならばデクリメント
Debug.Log(x > 0 ? ++x : --x); // -2

// if文で書いた場合
if (x > 0)
{
    ++x;
}
else
{
    --x;
}
Debug.Log(x);

5.結合規則と優先順位

ひとつの式の中に演算子を複数含む場合、優先順位に応じて演算の実行順序が決定します。
例えば、加算演算子と乗算演算子では、乗算演算子が優先的に処理されます。
また、代入演算子は最も優先順位の低い演算子となります。

ただし、優先的に実行したい演算を括弧()で囲むことで、実行順序を変更することができます。

優先順位が等しい演算子間の実行順序は、結合規則によって決定します。
結合規則には、左結合と右結合の2つがあります。
例えば、加算演算子の結合規則は左結合となります。

一方、代入演算子や三項条件演算子は右結合となります。

以下は、本記事で紹介した演算子の優先順位及び結合規則をまとめたものです。
これら全て覚える必要はありません。
基本的なルール(乗法が加法よりも優先される、括弧が優先される等)を押さえれば十分でしょう。

優先順位 種類 演算子 結合規則
一次式 x++ , x–– 右結合
単項式 +x , -x , !x , ~x , ++x , ––x 右結合
乗法式 x * y , x / y , x % y 左結合
加法式 x + y , x – y 左結合
シフト x <> y 左結合
関係式 x y , x = y 左結合
等値式 x == y , x != y 左結合
論理式AND & 左結合
論理式XOR ^ 左結合
論理式OR | 左結合
条件式AND && 左結合
条件式OR || 左結合
三項条件式 ?: 右結合
代入 = , op= 右結合

 

連載目次リンク

「初心者のための」Unityゲーム制作 目次
 

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次