ビット演算とは
コンピュータに保存されているデータの形式がバイナリデータであることは誰もが知っていますが、ビット演算とはデータをバイナリレベルで操作する手法です。ビット演算 0と1から構成されるバイナリデータを直接演算します。
#基本的なビット演算
基本的なビット演算は 6 つあります。** AND または NOT XOR 左および右シフト**
#シンボル
説明 |
動作規則 |
|
&## 両方のビットが # の場合 |
| と | が 1 の場合、結果は 1 になります。
| または、両方のビット | が 0 の場合、結果は 1 になります。 0
|
|
| #XOR | 2 つのビットが同じ場合、結果は 1 になります。同じでない場合は、結果は 1 になります。 、結果は 0 です。
#~ |
反転 |
0 は 1、1 は 0 |
##< になります。 ;左シフト | 各バイナリ ビットは特定のビット数だけ左にシフトされ、上位ビットは破棄され、下位ビットは 0# で埋められます。 |
##>>
右シフト |
各バイナリ ビットは特定のビット数だけ左にシフトされ、上位ビットは破棄され、上位ビットは無視されます。 bit には、コンパイラに応じて符号ビットまたはゼロが入ります。 |
|
#** まず第一に、ビット操作は整数に対してのみ操作できることを明確にする必要があります。**
JDK では、Java の右シフトは算術演算です。右シフト演算
#** ビット演算は優先順位が低いため、括弧を使用することをお勧めします **
上記のコードの出力結果:
なぜこの結果が出力されるのかを分析してみましょう:
まずとりわけ、 13 については、そのバイナリを書き込みます: 0000 1101
右に 2 桁シフト: 0000 0011. jdk の右シフトは算術右シフトであるため、上位ビットは次のようになります。 00 で埋められ、結果は 3
-13 の場合、バイナリ コード: 1111 0011
右に 2 ビットシフト、上位補数符号ビットの順序、1111 1100、結果は -4
一般的に使用されるビット演算ヒント
ビット演算整数値のみを操作できるため、小さな操作によく使用されますが、その用途は限られていますが、奇数と偶数の判断、2 つの数値の交換、符号の交換、絶対値の検索など、よく使用されるいくつかのヒントはマスターする価値があります。 、など。以下に一つずつ紹介していきます。
パリティの判定
パリティと偶数の違いはバイナリで反映され、末尾は 0, 1 になります。明らかに、末尾が 0 の場合は、が偶数で、末尾が 1 の場合は最後の 1 つの奇数となります。したがって、パリティを決定する方法は次のとおりです。
小さなテスト プログラム:
上記のプログラムは、すべての偶数を出力します。 1000 以内の数値
2 つの数値の交換
ビット演算を使用して 2 つの数値を交換する利点は、3 番目の一時変数が必要ないことです (制限は、整数変数のみを交換できます)
交換がどのように行われるかを分析します:
最初に a^=b、つまり a=(a^b);
b^=a、つまり b= b(ab)。 演算は交換法則を満たすため、b(ab)=bb^a。それ自体と XOR 演算される数値は、それ自体と等しい必要があるため、0 でなければなりません。したがって、数値が 0 と XOR 演算されても、1 と 0 は 1 のままで、0 と 0 は 0 のままです。つまり、数値と0 XOR の後は、もちろんそのままです。したがって、この時点では、b には値 a が割り当てられます。
最後のステップ、a^=b は、a=ab です。前の 2 つのステップは、a=(ab)、b=a を示しているため、a=ab は a=( a b)^a。したがって、a には b の値が割り当てられます。
シンボルの変換
シンボルの変換は明らかに非常に簡単で、同様の補数コードに従って、逆数を取得して 1 を加算するだけです。
#絶対値の求め方
絶対値の求め方は、符号を変えることで実現できます。負の数かどうかを判断し、負の数の場合は符号を変更し、そうでない場合は直接返します。 正か負かを判断するには、符号ビットを直接判断し、31 ビット右にシフトして符号ビットを取得し、正か負を判断します。
#任意の数値について、0 との XOR は変更されず、-1 との XOR (0xFFFFFFFF) は否定と等価です。したがって、絶対値は、a と i を XOR してから i を減算することによっても取得できます (i は 0 または -1 であるため、i を減算することは 0 を加算するか 1 を加算することを意味します)。したがって、上記のコードは次のように最適化できます。
ビット操作の適用
一般的なアルゴリズムの問題、ビットの実装演算 A と B の演算は、一般的なアルゴリズムの問題です。
#上記のコードは、演算子を使用せず、ビット演算を使用して 2 つの数値の加算演算を実現します。 次に、2 つの数値を加算するビット演算の原理を説明しましょう。
まず、10 進数では、7 8、キャリーなしの合計は 5、キャリーは 1 であることがわかり、次の式を使用できます。キャリーなしの合計とキャリー 5 1*10 は、最終結果 15 を計算します。
この方法は同様の二進法にも適用できます
例:
a = 3, b = 6
a: 0011
b: 0110
キャリーサムなし: 0101、これは 5
Carry: 0010 これは 2
なので、 a b は 5 (25 0101
2キャリーなし、0001 = 1
Carry 0100 = 4
したがって、 a b は 1 4 となり、キャリーなしの
1 0001
4 となり、1001 = 9# となります。 ## キャリーあり 0000 = 0
キャリーが 0 の場合、キャリーなしの合計は、a と b の合計である 9 になります。
上記は再帰的なプロセスであるため、コードを書くのは難しくないことがわかります。 2 つの数値のキャリーフリー和を求めることは、実際には 2 つの数値の単なる XOR 演算です。
以上がJavaビット操作のテクニックは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。