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 の各種演算子について説明しました。