Java 入門

ホーム > Java の基本 > 演算子

演算子

算術演算、論理演算等を行うための演算子について説明します。

算術演算

足し算、引き算、掛け算、割り算などを行う演算子は次のとおりです。

演算子役割
+足し算
-引き算
*掛け算
/割り算
%割り算の余り
++1 だけインクリメント (加算)
--1 だけデクリメント (減算)

さっそく、この実行例を示します。

public class OpTest1 {

     public static void main(String[] args) {

          System.out.println( 10 + 5 );
          System.out.println( 10 - 5 );
          System.out.println( 2 * 3 );
          System.out.println( 10 / 2 );
          System.out.println( 10 % 3 );
                    
     }
     
}

実行結果は次のとおりです。

15
5
6
5
1

尚、整数同士の計算には気をつけてください。整数同士の計算では結果も整数になり、小数点以下は切り捨てられます。 従って、10 / 3 の結果は 3 になります。

以下の例を見てください。

public class OpTest2 {

     public static void main(String[] args) {

          System.out.println( 10 / 3 );
          System.out.println( 10.0f / 3.0f );
          System.out.println( 10.0f / 3 );

     }

}

実行結果は次のとおりです。

3
3.3333333
3.3333333

整数同士の計算のときは結果が整数となるので、10 / 3 の結果が 3 となっています。 一方、10.0f / 3 という計算は (浮動小数点) / (整数) であり、結果は浮動小数点になるので答えは 3.333333 となります。

比較演算子

値の比較・評価を行うために、以下の演算子が用意されています。

演算子内容
==等しい
!=等しくない
>より大きい
>=より大きいか等しい (以上)
<より小さい
<=より小さいか等しい (以下)

さっそく例を示します。

public class OpTest4 {

     public static void main(String[] args) {

          boolean a;
          
          a = ( 1 == 2 );
          
          System.out.println( a );
          

          a = ( 1 < 2 );
          
          System.out.println( a );          

     }

}

最初に a という boolean の変数を用意します。次の行では 1 == 2 (1 と 2 は等しいかどうか?) の結果を a に代入しています。 (明らかに 1 と 2 は異なりますので、a には false が入ります)

a = ( 1 == 2 );

そして、次の行では 1 < 2 (1 より 2 が大きいかどうか) の結果を a に代入しています。 (明らかに 1 より 2 は大きいので、a には true が入ります)

a = ( 1 < 2 );

よって、上記の実行結果は次のようになります。

false
true

論理演算子

演算子意味
&AND 論理積
^XOR 排他的論理和
|AND 論理和
&&条件の AND
||条件の OR
!論理否定

シフト演算

演算子意味
<<左シフト
>>右シフト (符号拡張)
>>>右シフト (ゼロ拡張)

n >>> s はゼロ拡張 (zero extension) による右シフトです。 もし n が正の数ならばこれは n >> s と同等です。

シフト演算は実際にやってみるとわかり易いので、プログラムを書いて確かめてみましょう。

public class OpTest5 {

     public static void main(String[] args) {

          int a = 100;
          
          System.out.println( a );
          System.out.println( a >> 2 );
          System.out.println( a >>> 2 );

     }
}

実行結果は次のとおりです。

100
25
25

この結果はどうしてこうなるのでしょうか。

int は 32 ビットの符号付整数ですから、プラスの 100 は次のように表現できます。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0

これを 2 ビット右へシフトすると、次のようになります。

? ? 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1

ここで問題は、2 ビット右にシフトしたときに左側の ? の部分をどうするか?ということです。

>>> の場合は、ゼロ拡張ですから ? の部分は 0 とします。ですから、以下のようになります。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1

>> の場合は符号拡張であるので、? の部分を、元の数字の符号ビットと同じ値で埋めます。

そのために元の数字がどうだったか、もう一度元のビットを見てみましょう。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0
符号ビット  

符号ビットは 0 です。(もともと正の数ということは、ここが 0 ということですね)
従って、上の例では ? を 0 で埋めることになります。結果的に、>>> の場合と同一となります。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1

次に次の例を見てください。

public class OpTest6 {

     public static void main(String[] args) {

          int a = -100;
          
          System.out.println( a );
          System.out.println( a >> 2 );
          System.out.println( a >>> 2 );

     }

}

実行結果は次のようになります。

-100
-25
1073741799

これがなぜか考えると、次のようになります。

-100 は 100 の2の補数として次のように表現できます。

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0

ゼロ拡張 (>>>) で右に 2 ビットシフトすると、次のようになります。

0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1

すなわちこれは、1,073,741,799 です。

念のため電卓で検算すると、確かにビット列は合ってますね?

一方、符号拡張 (>>) で右に 2 ビットシフトすると、次のようになりますが、これは -25 を表します。

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1
ホーム > Java の基本 > 演算子