あなたは本当にビット演算を理解していますか?

1はじめに

プログラミング言語の基礎には、演算子は避けられません。演算子には、代入演算子、比較演算子、論理演算子、およびビット演算子があります。すべてのプログラミング学習者は最初の3つの演算子を学習する必要がありましたが、すべての人が4番目の可能性を学習したわけではありません。同じことが私にも当てはまります。最初の学習プロセスではビット演算子についてあまり知りませんでした。したがって、この記事では、ビット演算子の使用を整理します。

2.知識の準備

ビット演算子はバイナリビット(0101010)で動作するため、バイナリビット演算の詳細については、次の内容読む前に、元のコード、補数、および逆コードの詳細な説明を読むことをお勧めします

3.ビット演算子の詳細な説明

次の図に示すように、いくつかのビット演算子があります。
ここに画像の説明を挿入します

1.ビット単位の否定演算子〜

~これは単項演算の方法であり、データの各バイナリビットを反転します。つまり、1を0に、0を1に変更します。
例:

00010101 取反后为
11101010

2.ビットごとのAND演算子&

操作に関係する2つの値の場合、対応する2つのビットが両方とも1の場合、ビットの結果は1になり、それ以外の場合は0になります。つまり、0&0 = 0、0&1 = 0、1&0 = 0、1&1 = 1です。
例:

 00101010 (&) 
 00010111 
 00000010

ビットごとのANDを使用して、特定のビットをクリアできます。たとえば、数値11010110の2番目と5番目のビットをクリアすると、その数値を11101101(有効な桁の前のビットから計算)とAND演算できます。

11010110 (&) 
11101101 
11000100

ビット単位のANDを使用して、特定の数の特定の指定ビットを取得できます。たとえば、数値11010110の2桁目と5桁目を取得する場合は、この数値と00010010を使用してビット単位のAND演算を実行できます。

 11010110 (&)
 00010010 
 00010010

3.ビットごとのOR演算子|

操作に関係する2つの値について、対応する2つのビットの1つが1である限り、そのビットの結果は1です。つまり、0 | 0 = 0、0 | 1 = 1、1 | 0 = 1、1 | 1 = 1です。
例:

 00101010 ( | ) 
 00010111 
 00111111

ビットごとのOR演算子を使用して、特定の位置を1に変更できます。

4.ビット単位の排他的論理和演算子^

操作に関係する2つの値について、対応する2つのビットが同じである場合、結果は0になり、それ以外の場合は1になります。つまり、0 ^ 0 = 0、1 ^ 0 = 1、0 ^ 1 = 1、1 ^ 1 = 0です。
例えば:

00101010 ( ^ )
00010111 
00111101

ビット単位のXOR演算により、一時変数を使用せずに2つの値を交換できます。たとえば、2つの整数aとbの値を交換するには、たとえば次のようにします。

a = 11010110,b = 01011001 
a = a ^ b; // a = 10001111 
b = b ^ a; // b = 11010110    
a = a ^ b; // a = 01011001

5.左シフト演算子<<

これは、数値のすべてのバイナリビットを数ビット左にシフトするために使用されます。たとえば、a = a << 2の場合、aの各バイナリビットを左に2ビットシフトし、右に0を追加します。a= 00001111の場合、a << 2 = 00111100です。ハイビット左シフト後のオーバーフロー、破棄は効果がありません
オーバーフローがない場合、1ビットを左にシフトすることは2を乗算することと同等であり、乗算の速度は左にシフトすることによる乗算よりも高速です。

6.右シフト演算子>>

これは、数値のすべてのバイナリビットを数ビット右にシフトするために使用されます。たとえば、a = a >> 2の場合、aのバイナリビットを2ビット右にシフトします。右に移動した下位ビットは破棄され、上位ビットは元の上位値に移動しますたとえば、a = 00110111、次にa >> 2 = 00001101、b = 11010011、次にb >> 2 = 11110100です。
1ビットを右にシフトすることは、商を取得するために2で除算することと同等であり、右シフトによる除算の速度は除算の速度よりも高速です。

7.符号なし右シフト演算子>>>

数値の各2進ビットを数桁の符号なし右シフトに使用します。演算子>>と同じです。シフトアウトされた下位ビットは破棄されますが、上位ビットが0で埋められる点が異なります。たとえば、a = 00110111、次にa >>> 2 = 00001101、b = 11010011、次にb >>> 2 = 00110100です。

この記事のリファレンス:
「Javaプログラミング/唐だし編集」

おすすめ

転載: blog.csdn.net/qq_41262903/article/details/106573533