Unity ビット操作の導入と使用

導入

ビット演算とは、2 進数のビットを操作する演算子を指し、効率的な論理演算と数学演算を実装できます。Unity で一般的に使用されるビット演算子は次のとおりです。

And (&) : 2 つのビットのみが 1 の場合、結果は 1;
または (|) : 2 つのビットのいずれかが 1 である限り、結果は 1;
not (~) : ビットが 0 の場合、結果はは 1、ビットが 1 の場合、結果は 0;
XOR (^) : 2 つのオペランドのビットが同じ場合、結果は 0、異なる場合、結果は 1; 左
シフト (< <) : 左シフトは 2 倍、左シフトは 2 乗、
右シフト (>>) : 右シフトは 2 で割る、右シフトは 2 乗、
符号なし右shift (>>>) : no matter 左オペランドの型に関係なく、上位の空のビット位置は常にゼロに設定されます。

テスト

バイナリ:
1010 & 0010 = 0010
1010 | 0010 = 1010
~1010 = 1111111111110101
1010 ^ 0010 = 1000
1010 << 2 = 00101000
1010 >> 2 = 0010

10進数:
10 & 2 = 2
10 | 2 = 10
~10 = -11
10 ^ 2 = 8
10 << 2 = 40
10 >> 2 = 2

使用

ビット操作には多くの例がありますが、一般的なものをいくつか示します。

1.偶数かどうかの判断: a & 1 == 0 を使用して判断できます、真であれば a の最下位ビットが 0、つまり a が偶数であることを意味し、偽であれば、a の最下位ビットが 1、つまり a が奇数であることを意味します。
2. 2 つの数値の値を交換する: XOR 演算によって実現できます。たとえば、a = a ^ b; b = a ^ b; a = a ^ b; a と b の値は次のようになります。追加の変数なしで交換されます。
3.数値の一部のビットを反転: XOR 演算とマスクによって実現できます。たとえば、a = a ^ マスク; a とマスクの同じ位置のビットを反転でき、マスクの 1 のビットは意味します0 のビットを反転することは、変更されないことを意味します。
4.数値の一部のビットを 1 に設定: OR 演算とマスクによって実現できます、たとえば、a = a | mask; a と mask の同じ位置のビットを 1 にし、1 のビットをマスクの は、1 に設定されたビットと 0 のビットは変更されないことを意味します。
5.数値の一部のビットを 0 にクリア: AND 演算とマスクによって実現できます。マスクでは、0 にクリアされたビット、1 に設定されたビットは変更されないことを意味します。

Unityで使用

Unity でビット操作を使用する一般的なシナリオは、レイヤーを扱う場合です。Layer 層は int32 で表され、各ビットは層を表します。たとえば、ビット 0 はデフォルト レイヤーを表し、ビット 8 は水レイヤーを表します。特定のレイヤーのみを表示または無視するようにオブジェクトまたはカメラを設定する場合は、ビット演算子を使用できます。例えば:

LayerMask mask = 1 << 8; //Water レイヤーを有効にする
LayerMask mask = 1 << 0 | 1 << 8; //Default レイヤーと Water レイヤーを有効にする
LayerMask mask = ~ (1 << 8); //Water レイヤーを閉じる
LayerMask mask = ~ (1 << 0 | 1 << 8); //デフォルト レイヤーと水レイヤーを閉じる
camera.cullingMask |= 1 << LayerMask.NameToLayer (“Npc”); //Npc レイヤーを開く
camera.cullingMask & = ~ (1 << LayerMask.NameToLayer (“Npc”)); //Npc レイヤーを閉じる
camera.cullingMask ^= 1 << LayerMask.NameToLayer (“Npc”); //Npc レイヤーを切り替える

おすすめ

転載: blog.csdn.net/qq_39162826/article/details/130237960