|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
演算子算術演算、論理演算等を行うための演算子について説明します。 算術演算足し算、引き算、掛け算、割り算などを行う演算子は次のとおりです。
さっそく、この実行例を示します。 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 論理演算子
シフト演算
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 は次のように表現できます。
これを 2 ビット右へシフトすると、次のようになります。
ここで問題は、2 ビット右にシフトしたときに左側の ? の部分をどうするか?ということです。 >>> の場合は、ゼロ拡張ですから ? の部分は 0 とします。ですから、以下のようになります。
>> の場合は符号拡張であるので、? の部分を、元の数字の符号ビットと同じ値で埋めます。 そのために元の数字がどうだったか、もう一度元のビットを見てみましょう。
符号ビットは 0 です。(もともと正の数ということは、ここが 0 ということですね)
次に次の例を見てください。 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の補数として次のように表現できます。
ゼロ拡張 (>>>) で右に 2 ビットシフトすると、次のようになります。
すなわちこれは、1,073,741,799 です。 念のため電卓で検算すると、確かにビット列は合ってますね?
一方、符号拡張 (>>) で右に 2 ビットシフトすると、次のようになりますが、これは -25 を表します。
|
|
© 2010 Java 入門 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||