ビット演算(AND、OR、XOR)

ビット演算

ビット演算は、プログラミングにおける配列または 2 進数に対する単項演算および 2 項演算です。多くの古いマイクロプロセッサでは、ビット単位の演算は加算や減算よりわずかに高速であり、一般にビット単位の演算は乗算や除算よりもはるかに高速です。最新のアーキテクチャでは、ビット単位の演算は加算と同じ速度で動作することがよくあります (それでも乗算よりも高速です)。コンピュータ内のデータはメモリ上にバイナリ形式で格納されており、ビット演算はメモリ上の整数のバイナリビットを直接演算するため、実行効率が非常に高いです。

そして(&)

結果は、演算に関与する両方のビットが 1 の場合にのみ 1 になり、それ以外の場合は 0 になります。

  • 1&1=1
  • 1&0=0
  • 0&0=0

例1:

 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001  (1 在内存中的存储)

例 2:
値 a が奇数か偶数かを判断します。

//思路:只要根据数的最后一位是0还是1来决定即可,为0就是偶数,为1就是奇数
if((a&1)==0){
    Debug.Log("偶数");
}else{
    Debug.Log("奇数");
}

または (|)

演算に含まれる 2 ビットのうちの 1 つが 1 の場合、結果は 1 になり、それ以外の場合は 0 になります。

  • 1|1=1
  • 1|0=1
  • 0|0=0

例:

   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
 | 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1101  (13 在内存中的存储)

取反(~)

演算に関係するビットを否定し、0 は 1 になり、1 は 0 になります。

  • ~1=0
  • ~0=1

例:

~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111  (-9 在内存中的存储)
-----------------------------------------------------------------------------------
 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000  (8 在内存中的存储)

XOR (^)

演算に関係するビットを比較し、同じであれば 0 を、異なる場合には 1 を取得します。

  • 1^1=0
  • 1^0=1
  • 0^0=0

例:

   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001  (9 在内存中的存储)
 ^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101  (5 在内存中的存储)
-----------------------------------------------------------------------------------
   0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1100  (12 在内存中的存储)

例 2:
3 番目の一時変数を作成せずに 2 つの数値を交換しますか?

int a =10;
int b =35;
a=a^b;
b=a^b;
a=a^b;
Debug.Log($"a={a}");
Debug.Log($"b={b}");

出力結果は次のようになります:
a=35
b=10

説明する:

  1. a=a^b
  2. b=a b b b^b は 0 なので、結果は a になります。
  3. a=a^b= a b a a^a は 0 なので、結果は b になります。

シフト

左にシフト (<<)

データのすべてのバイナリ ビットを特定のビット数だけ左にシフトし、上位ビットを破棄し、下位ビットを 0 で埋めます。

例:

3<<2
1. 3的二进制数为:0000 0000 0000 0000 0000 0000 0000 0011
2. 把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。
3. 得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12。

数学的意味:

  • 数値がオーバーフローしない限り、正の数値と負の数値の場合、1 ビットを左にシフトすることは 2 の 1 乗を乗算することと同等であり、n ビットを左にシフトすることは 2 の 2 乗を乗算することと同等です。 n番目の力。

右に移動 (>>)

データのすべてのバイナリ ビットを特定のビット数だけ右にシフトし、下位ビットを破棄し、上位ビットに 0 または 1 を追加します。データの最上位ビットが 0 の場合は 0 を追加し、最上位ビットの場合は 0 を追加します。ビットが 1 の場合は 1 を加算します。

例:

11 >> 2
1. 11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011
2. 把低位的最后两个数字移出,因为高位是0,所以在高位补0
3. 得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010。转换为十进制是2。

数学的意味:

  • 1 ビットを右にシフトすることは 2 で除算することと等価であり、n ビットを右にシフトすることは 2 の n 乗で除算することと等価です。

おすすめ

転載: blog.csdn.net/weixin_42498461/article/details/131069988