ホームページ  >  記事  >  Java  >  Java ビット操作の概要 (コード例)

Java ビット操作の概要 (コード例)

不言
不言転載
2019-03-07 17:38:162501ブラウズ

この記事は 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 : 1000

8>>1
4 : 0100

実行結果:

a toBinaryString: 1000

a>>1 toBinaryString: 100
result: 4

実際には、次の式がもう 1 つあります。 :

a>>n は / (2^n) 乗を意味します。 (四捨五入)

a<

それでは、簡単な計算をしてみましょう:

a = 13 の場合、n = 2。 13(上記の速度アルゴリズムに誤りがある場合は、遠慮なく私の顔を平手打ちしてください!!!)


ビット シフト演算はソース コードや一般的なアルゴリズムで非常に一般的であり、Java プログラマがビット演算を習得することも必要です。これは、アルゴリズムとソース コードを理解するのに非常に役立ちます。


以上がJava ビット操作の概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。