Java の演算子

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

Java の算術演算

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

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

さっそく、これら算術演算の実行例を示します。

public class TestApp {
  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 TestApp {
  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 となります。

Java の比較演算子

Java では値の比較・評価を行うための比較演算子として以下が用意されています。

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

さっそく例を示します。

public class TestApp {
  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 が入ります)

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

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

false
true

Java の論理演算子

Java の論理演算子は次の表の通りです。

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

Java のシフト演算

Java のシフト演算子は下表の通りです。

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

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

シフト演算の意味を説明します。

シフト演算は実際に動作を確認して、ビットがどのように変化するかみてみるとわかり易いです。プログラムを書いて確かめてみましょう。

public class TestApp {
  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 は次のように表現できます。

00000000000000000000000001100100

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

??000000000000000000000000011001

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

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

00000000000000000000000000011001

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

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

00000000000000000000000001100100

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

00000000000000000000000000011001

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

public class TestApp {
  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の補数として次のように表現できます。

11111111111111111111111110011100

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

00111111111111111111111111100111

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

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

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

11111111111111111111111111100111

以上、Java の各種演算子について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門