この記事は Java ビット操作の入門 (コード例) です。これは一定の参考価値があります。必要な友人はそれを参照できます。お役に立てば幸いです。
コンピュータの世界では、どんなに複雑で美しいプログラムであっても、最終的には0と1になることは誰もが知っています。それは私たちがよく言う「バイナリ」です。バイナリについては誰もがよく知っていると思います。現実の世界と異なるのは、現実の世界では通常、10 対 1 に遭遇するとき、それを表現するために 10 進数を使用することです。これらはすべて私たちにとって馴染みのあるものです。この時点で、現実世界の 10 進数とコンピュータの 2 進数の測定単位が異なるという手がかりが見つかります。では、それらの間で変換するにはどうすればよいでしょうか?これには、比較的基本的なコンピューターの知識が必要です。この記事では説明しません (興味があれば、次回お話しできます)。さて、今日の話に戻りますが、ビット演算とはどのような概念なのでしょうか?私たちは子供の頃から現実世界において十進法による足し算、引き算、掛け算、割り算の演算に触れてきました。今日は、バイナリ ビットでの一般的な演算について説明します。例: & (ビット AND)、| (ビット OR)、^ (排他的 OR)、<< (左シフト)、>> (右シフト) など。
True と False
演算子を使用する前に、true と false について説明する必要があります。 Java では、true 値が true を表し、false 値が false を表すことは誰もが知っています。実際、コンピュータでは通常、真を表すには 1 が使用され、偽を表すには 0 が使用されます。 Json を使用したことのある学生は、Java のブール型も 1 を使用して true に逆シリアル化でき、0 を false に逆シリアル化できることを知っている必要があります。
& (ビット AND)
ビット AND について説明する前に、よく知られている && 論理 AND 演算について説明しましょう。簡単に言うと、A&&B は、A と B が同時に真である場合は真、それ以外の場合は偽であることを意味します。 「一度嘘になったら、それは嘘でなければならない」という人もいます。
次に、位置とを見てみましょう。まず、プログラムを見てみましょう:
@Test
public void testBit(){ int a = 8; int b = 9; System.out.println("a binary: "+Integer.toBinaryString(a)); System.out.println("b binary: "+Integer.toBinaryString(b)); System.out.println("a & b binary: "+Integer.toBinaryString(a&b)); System.out.println("a & b result: "+(a&b)); }
説明を見る前に、結果がどうなるかを推測しましょう。
コードの説明:
ビット AND: 文字通り理解すると、これもバイナリ ビットの AND 演算です。
数字 8 の 10 進表記は 1000 です。
数字 9 の 10 進表記は 1001 です。
もう一度位置情報操作を実行してみましょう:
は次のとおりです:
8:1000
9:1001
&
8 1000
左端の 1&1 = 1、中央の 0&0 = 0、右端の 0&1 = 0。
2 進数の結果は 1000 となり、10 進数に変換すると 8 になります。
プログラムの実行結果は次のとおりです。
a バイナリ: 1000
b バイナリ: 1001
a & b バイナリ: 1000
a & b 結果: 8
結果は予想どおりです。
| (ビット OR)
上記の & (ビット AND) 演算では、ビット OR 演算を見て、引き続き上記の例を使用してみましょう。 : 以下に示すように :
@Test
public void testBit(){ int a = 8; int b = 9; System.out.println("a binary: "+Integer.toBinaryString(a)); System.out.println("b binary: "+Integer.toBinaryString(b)); System.out.println("a & b binary: "+Integer.toBinaryString(a|b)); System.out.println("a & b result: "+(a|b)); }
バイナリをもう一度見てください:
8:1000
9:1001
|
9 1001
左端は 1|1 = 1、中央は 0|0 = 0、右端は 0|1 = 1。
結果は 2 進数で 1001 となり、対応する 10 進数は 9 になります。
演算結果は次のとおりです。
a バイナリ: 1000
b バイナリ: 1001
a & b バイナリ: 1001
a & b 結果: 9
^(XOR)
この演算子はさらに興味深いもので、X は文字通り「異なる」を意味します。配置操作についても同様です。上記の例を引き続き使用します:
@Test
public void testBit(){ int a = 8; int b = 9; System.out.println("a binary: "+Integer.toBinaryString(a)); System.out.println("b binary: "+Integer.toBinaryString(b)); System.out.println("a & b binary: "+Integer.toBinaryString(a^b)); System.out.println("a & b result: "+(a^b)); }
引き続きバイナリを確認します:
8:1000
9:1001
^
1 0001
は、ビットが同じ場合は false、異なる場合は true になります。左側の 1=1 は false、つまり 0 と同じです。真ん中の0=0も偽で0です。右端の 0 は 1 に等しくありませんが、これは当てはまります。結果は 1 です。
<<(左シフト)
現実の世界では、乗算をよく使用します。 << は 2 進数でのディスプレースメント演算を表し、下位ビットは 0 で埋められます。例: 8<<1。
@Test
public void testCode(){ int a =8; System.out.println("a toBinaryString: "+Integer.toBinaryString(a)); System.out.println("a<<1 toBinaryString: "+Integer.toBinaryString(a<<1)); System.out.println("result: "+(a<<1));
バイナリは次のとおりです:
8 1000
8<<1
16 10000
結果2^4=16です。 << 左側の a は基数を表し、右側の 1 はシフトする必要があるビット数を表します。矢印がどちらの方向を向いていても、そこに変位が進みます。プログラム実行結果:
a toBiryString: 1000
a<<1 toBinaryString: 10000
result: 16
>> 右にシフト
#(右シフト) は左シフト << の逆で、上位ビットは 0 で埋められます。上記の例を続けます:@Test
public void testCode(){ int a =8; System.out.println("a toBinaryString: "+Integer.toBinaryString(a)); System.out.println("1>>a toBinaryString: "+Integer.toBinaryString(a>>1)); System.out.println("result: "+(a>>1) } バイナリ: 8 : 10008>>1
実行結果: a toBinaryString: 1000
4 : 0100a>>1 toBinaryString: 100
実際には、次の式がもう 1 つあります。 :a>>n は / (2^n) 乗を意味します。 (四捨五入)a<
result: 4それでは、簡単な計算をしてみましょう: a = 13 の場合、n = 2。 13(上記の速度アルゴリズムに誤りがある場合は、遠慮なく私の顔を平手打ちしてください!!!)
ビット シフト演算はソース コードや一般的なアルゴリズムで非常に一般的であり、Java プログラマがビット演算を習得することも必要です。これは、アルゴリズムとソース コードを理解するのに非常に役立ちます。
以上がJava ビット操作の概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。