ビット演算子

ビット演算子は2つのビット値を受け取り、AND/ORを使ってビットごとに演算を行い その結果を返します。ビット演算子には次の3つがあります

ビット演算子の種類

  • &(AND)
    • &(AND)演算子は2つの数値の対応するビット同士を比較し、両方のビットが共に1であれば、 結果のビットも1になります。
      対象になるビットが片方、もしくは両方とも0であれば、 結果も0が返されます。
  • |(包含OR)
    • |(OR)演算子も&(AND)演算子と同じくビット同士を比較するのですが、&(AND)演算子が 両方のビットが共に1であれば、結果に1が返されるのに対し、|(OR)演算子は両方の 、もしくは片方のビットが1であれば結果に1が返されます。
      要するにビットが共に0のときだけ0が返されます。
  • ^(排他OR,XORとも呼びます)
    • ^(排他OR)は2つのビット同士が異なるかどうかを結果に返されます。
      両方のビットが異なれば結果に1が返されるわけです
では順番に処理の流れを確認していきます。

&(AND)

   int x = 15;
   int y = 20;
   x & y;

上の例で考えていきます。まず、それぞれ x と y の値を2進数にします。

int x = 15; を2進数にします。

2進数にするには15を2で割っていきます。
以下のようになります。

上記計算で余りがあれば1なければ0になります。
つまり、10進数の15を2進数にすると1111になります。

ここで int x = 15; を2進数にします。

int型の範囲は32bitでした。すなわちint x = 15;を2進数にすると以下のようになります。

0000 0000 0000 0000 0000 0000 0000 1111

int y = 20; を2進数にします。

これも2で割っていくと以下のようになります。

10進数の20を2進数にすると以下のようになります。

10100

int y = 20;を2進数にすると以下のようになります。

0000 0000 0000 0000 0000 0000 0001 0100

x & y; の求め方

int x = 15; int y = 20;を2進数にすることができました。
ここで&演算子について見ていきます。

&演算子とは最初に説明したとおり

&(AND)演算子は2つの数値の対応するピット同士を比較し、両方のピットが共に1であれば、
結果のピットも1(true)になります。対象になるピットが片方、もしくは両方とも0(falseであれば、
結果も0が返されます。

int x = 15; とint y = 20;の2進数表記はこれでした

0000 0000 0000 0000 0000 0000 0000 1111
0000 0000 0000 0000 0000 0000 0001 0100

&演算子はともにビット値が1なら1になるので、この場合は青字の部分だけ1になります。

つまり
int x = 15;
int y = 20;

x & y;の値は

0000 0000 0000 0000 0000 0000 0000 0100

になります。

x & yを10進数に戻します

2進数表記は

0000 0000 0000 0000 0000 0000 0000 0100

でした。これを元の10進数に直したいと思います。
0
0
0
0
0
1
0
0
1

になり

2X2=4になります。

したがって

x & y の値は4になります。

Sponsored link

|(包含OR)

   int a = 25;
   int b = 17;
    a | b;

上の例で考えていきます。まず、それぞれ a と b の値を2進数にします。

int a = 25;を2進数にします

これも2で割っていくと以下のようになります。

つまり10進数の25を2進数表記で表すと以下のようになります。

11001

つまりint a = 25; は以下のようになります。

0000 0000 0000 0000 0000 0000 0001 1001

int b = 17;を2進数にします

これも2で割っていくと以下のようになります。

つまり10進数の17を2進数表記で表すと以下のようになります。

10001

つまりint b = 17; は以下のようになります

0000 0000 0000 0000 0000 0000 0001 0001

a | b; の求め方

int a = 25;int b = 17;を2進数にすることができました。
ここで|演算子について見ていきます。

|演算子とは最初に説明したとおり

|(OR)演算子も&(AND)演算子と同じくビット同士を比較するのですが、&(AND)演算子が
両方のビットが共に1であれば、結果に1が返されるのに対し、|(OR)演算子は両方の
、もしくは片方のビットが1であれば結果に1が返されます。
要するにビットが共に0のときだけ0が返されます。

int a = 25; と int b = 17; の2進数表記はこれでした

0000 0000 0000 0000 0000 0000 0001 1001
0000 0000 0000 0000 0000 0000 0001 0001

|演算子は片方のビットが1なら1になるので青字の部分がすべて1になります。

つまり

int a = 25;
int b = 17;

a | b;の値は

0000 0000 0000 0000 0000 0000 0001 1001

になります。

a | b を10進数に戻します

int a = 25;
int b = 17;

a | b;

の2進数表記はこれでした

0000 0000 0000 0000 0000 0000 0001 1001

これを10進数に直したいと思います。
0
0
0
1
1
0
0
1
1

となり

2X2X2X2=16
2X2X2=8
1

16 + 8 + 1 = 25になります。

したがってa | b の値は25になります。

Sponsored link

大容量無制限レンタルサーバー【X2】利用者のみドメインが激安
選べるプランとOS!さくらのVPS

^(排他OR)

   int c = 11;
   int d = 19;
   a ^ b;

上の例で考えていきます。まず、それぞれ c と d の値を2進数にします。

int c = 11;を2進数にします

これも2で割っていくと以下のようになります。

つまり10進数の11を2進数表記で表すと以下のようになります。

1011

つまりint c = 11; は以下のようになります

0000 0000 0000 0000 0000 0000 0000 1011

int d = 19;を2進数にします

これも2で割っていくと以下のようになります。

つまり10進数の19を2進数表記で表すと以下のようになります。

10011

つまりint d = 19; は以下のようになります

0000 0000 0000 0000 0000 0000 0001 0011

c ^ d の求め方

int c = 11;int d = 19;を2進数にすることができました。
ここで^演算子について見ていきます。

^演算子とは最初に説明したとおり

^(排他OR)は2つのビット同士が異なるかどうかを結果に返されます。
両方のビットが異なれば結果に1が返されるわけです。

int c =11; と int d = 19; の2進数表記はこれでした

0000 0000 0000 0000 0000 0000 0000 1011
0000 0000 0000 0000 0000 0000 0001 0011

^演算子はお互いのビットが異なるなら1になるので青字の部分がすべて1になります。

つまり

int c = 11;
int d = 19;

c | d;の値は

0000 0000 0000 0000 0000 0000 0001 1000

になります。

c ^ d のを10進数に戻します

int c = 11;
int d = 19;

c ^ d;

の2進数表記はこれでした

0000 0000 0000 0000 0000 0000 0001 1000

これを10進数に直したいと思います。
0
0
0
1
1
0
0
0
1

となり

2X2X2X2 = 16
2X2X2 = 8

16 + 8 = 24

したがって c ^ d  の値は24 となります。

では、今までのことをサンプルプログラムで確認したいと思います。

サンプルプログラム(Sample18.java)

class  Sample18{
    public static void main(String args[]){
int x = 15,y=20,a =25,b=17,c = 11,d = 19;
System.out.println("x & y =" + (x & y)); System.out.println("a | b =" + (a | b)); System.out.println("c ^ d =" + (c ^ d)); } }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

実行結果からも確認出来たと思います。

ページのトップへ戻る