[J2SE1.4] 演算子とデータのメモリの割り当て

Q1 正しいのは?

a. int a = 0x30000;
b. byte b = -0200;
c. double c = 3E+100;

A1

整数リテラルの表現を問う問題

○a. int a = 0x30000;
   頭の0xは、16進数を表す。16進数で30000は、10進数196608(=3*16^4)で、
   intの表現可能範囲内。
○b. byte b = -0200;
   頭の0は、8進数を表す。8進数で200は、10進数-128(=-2*8^2)で、
   byteの表現可能範囲内。
○c. double c = 3E+100;
   nE+yは、浮動小数表現のn*10^yを表す。3E+10は、10進数で30000000000で、
   doubleの表現可能範囲内。

--------------------------------------------------
Q2 何が表示される?

01:public class JavaBasic [
02:
03:  public static void main(String[] args) {
04:    int b = 10;
05:    b = ~b;
06:    b = b >> 3;
07:    b = b << 3;
08:    syso(b);
09:  }
10:}
11:
A2

-16

L.4: 10を2進数で表現すると[00000000000000000000000000001010](intは32bitなので32桁)になる。
L.5: ビット反転(~)すると[11111111111111111111111111110101]になる。
L.6: 3つ符号保存右シフト(>>)すると[11111111111111111111111111111110]となる。
符号保存右シフトは、最上位ビットが1のときは1が、0の時は0がシフトさせた後の最上に現れる。
符号無視右シフト(>>>)は常に0が現れる。
L.7: 左にシフト(<<)すると[11111111111111111111111111110000]となる。
これを10進数に直すと[-16]になる。

--------------------------------------------------
Q3 何が表示される?

public class JavaBasic {
  public static void main(String[] args[]) {
    int b = 10^10 + 10|10;
    syso(b);
  }
}

A3

30

ビット演算子は、優先順位が低い演算子で、[+]演算子の方が先に演算される。
→[10^(10 + 10)|10]となる。

前半部分[10^20]は、2進数で、
00000000000000000000000000001010 ^
00000000000000000000000000010100 =
00000000000000000000000000011110
という演算になる。
[^]演算子は、各ビット値を比較して異なる場合のみ1にする演算を行う。

後半部分は、
00000000000000000000000000011110 |
00000000000000000000000000001010 =
00000000000000000000000000011110
という演算になる。
[|]演算子は、各ビット値を比較してどちらか一方でも1の場合に1にする演算をする。

これを10進数に直すと、[30]になる。

--------------------------------------------------
Q4 実行結果は?

public class JavaBasic {
  public static void main(String[] args) {
    String a = null;
    int b = null;
    boolean c = (b > 5) | a.equals("ABC");
    syso(c);
  }
}

a. true
b. false
c. nullPointerException

A4

○c. nullPointerException

[|]演算子は、boolean型に対しても演算出来る。

論理演算子[||]と同じ演算結果になるが、[||]演算子の場合は、
左辺がtrueであれば右辺はtrueでもfalseでも演算結果はtrueになるため、
左辺がtrueの時は、右辺を実行しない。

論理演算子[|]は、左辺の結果が何であれ、必ず右辺を実行する。

a.equals("ABC")が実行されると、aがnullでヌルポが出る。

boolean c = (b > 5) || a.equals("ABC");
とすれば、実行結果trueとなる。


goto [J2SE1.4] INDEX

tag : XXX

2008-06-25 00:48 : __lang__java : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud