当たるかもしれない競馬予想

あまり当たらないけど、たまに当たる競馬予想です。
ちょっとプログラムのことも書こうかな

情報処理試験(H20春) ソフトウェア開発技術者 午前問1~5

2008-04-29 | 情報処理
問1 16ビットの2進数nを16進数の各桁に分けて、下位のけたから順にスタックに格納するために、次の手順を4回繰り返す。(a),(b)に入る適切な語句の組み合わせはどれか。
ここで、xxxx(16)は16進数xxxxを表す。

[手順]
(1) (a)をxに代入する。
(2) xをスタックにプッシュする。
(3) nを(b)論理シフトする。

┌───────┬──────┐
│ (a) │ (b) │
┌─┼───────┼──────┤
│ア│n AND 000F(16)│左に4ビット │
├─┼───────┼──────┤
│イ│n AND 000F(16)│右に4ビット │
├─┼───────┼──────┤
│ウ│n AND FFF0(16)│左に4ビット │
├─┼───────┼──────┤
│エ│n AND FFF0(16)│右に4ビット │
└─┴───────┴──────┘


解答


解説
問題文の意味が、わかりづらいような気がしますので、念のため問題文の意味を解釈します。

問題文:「16ビットの2進数nを16進数の各桁に分けて」は
例えば、2進数「1010 1011 1100 1101」を16進数「ABCD」のA,B,C,Dに分けてと言うことでしょう。

問題文:「下位のけたから順にスタックに格納する」は
D,C,B,Aの順にスタックに格納する。

と言うことでしょう。

まぁ、ここまで解釈できれば、答えは導けたと同じですねぇ。
上記の例を元にすれば最初に16進数の最下位のけた(D)を取り出すので

・ ABCD(16) AND 000F(16)を取ればよいことになります。

なので、選択肢はア、イに絞られます。

また、次に下二けた目の(C)を最下位のけたにずらし、以下のようにするには、

ABCD(16)->XABC(16) (Xは任意の16進数)

と言うことは、

・nを右に4ビットシフトする。

になり、選択肢はイになります。

個人的には、かなり基本問題だと思います。

難易度(1(易)~5(難))
1


問2 次の浮動小数点表示法がある。小数点は仮数の左にあり、指数は64の"下駄履き表現"であって、値は(-1)^s×0.f×2^(e-64)である。二つの16進数45BF0000と41300000をこの浮動小数点表示法で表現された値として加算した結果はどれか。

31 30 24 23 0
┌─┬────┬────────┐
│s │ e │ f │
└─┴────┴────────┘
↑ ↑ ↑
│ │ └─── 仮数部
│ └───────── 指数部
符号

ア 41EF0000
イ 45C20000
ウ 45EF0000
エ 86EF0000


解答


解説
とりあえず問題文にある2つの数字を2進数に表した、符号、指数部及び仮数部がわかるようにします。
s │ e │ f
45BF0000 0 │100 0101 │ 1011 1111 0000 0000 0000 0000
41300000 0 │100 0001 │ 0011 0000 0000 0000 0000 0000
│ │

「浮動小数の加算は指数部の値を大きい方に合わせる。」ので41300000の2進数表記を以下のように変更されます。

41300000 0 │100 0101 │ 0000 0011 0000 0000 0000 0000

指数部に4を加えたので、仮数部を右に4ビットシフトしました。

そして、2つの数字を加算すればよいことになります。

s │ e │ f
45BF0000 0 │100 0101 │ 1011 1111 0000 0000 0000 0000
41300000 0 │100 0101 │ 0000 0011 0000 0000 0000 0000 (変換後)
加算結果 0 │100 0101 │ 1100 0010 0000 0000 0000 0000

加算結果は 0100 0101 1100 0010 0000 0000 0000 0000
となり、16進数で表すと
45C20000
になります。
よって、解答はイとなります。

個人的には基本問題だと思います。

また、関連用語として、

桁落ち
情報落ち
などがあります。

桁落ちは、同じぐらいの2数の減算を行うと有効数字が減少することです。
具体的には、減算の時も指数部を揃えます。絶対値が同じぐらいなので、結果的にそろっていると思います。
45BF0001と45BF0000の減算を例にすると、

45BF0001 0 │100 0101 │ 1011 1111 0000 0000 0000 0001
45BF0000 0 │100 0101 │ 1011 1111 0000 0000 0000 0000
減算結果 0 │100 0101 │ 0000 0000 0000 0000 0000 0001

となります。しかし、計算結果の仮数部の先頭は1にするように正規化されます。
つまり、この場合仮数部は1000 0000 0000 0000 0000 0000と23ビット左にシフトされます。
すると、指数部は00101110となります。
仮数部の下位ビットがすべて0になってしまうのは数学的な計算をした結果とはおそらく異なります。
この下位のビットが0になってしまうことを桁落ちと言うそうです。

また情報落ちは差の大きい2数の加算をするとき小さい数の仮数部がなくなってしまうことを言います。
例えば45BF0000と05BF0000の加算を例にすると、05BF0000の仮数部を64ビット右にシフトするので0になってしまいます。
45BF0000 0 │100 0101 │ 1011 1111 0000 0000 0000 0000
05BF0000 0 │000 0101 │ 1011 1111 0000 0000 0000 0000
05BF0000 0 │100 0101 │ 0000 0000 0000 0000 0000 0000 (変換後)
計算結果 0 │100 0101 │ 1011 1111 0000 0000 0000 0000

この辺の用語も午前には出そうなので、覚えておきたいですねぇ。

難易度(1(易)~5(難))
1

問3 浮動小数点形式で表現されたx(x>>1)に対して、√(x+1) - √(x)をそのまま計算すると、けた落ちが生じることがある。それを防ぐために変形した式として、適切なものはどれか。

ア 1/(√(x+1) + √(x))
イ √(2x+1 - 2√(x)√(x+1))
ウ √(x)√(x+1)(1/√(x) - 1/√(x+1))
エ (√(x)√(x+1)-x)/√(x)

解答


解説
問2の解説に関連事項的に書いた「けた落ち」の問題ですねぇ。
私自身もよくわかりませんでした。
ここは解説と言うよりは、「私はこう考えた。」的なことを書いておきます。

簡単に言うと、「減算が無いようにする」ような式に変形されていればよいのではないでしょうか。

つまり、「けた落ち」は「同じぐらいの2数の減算を行うと有効数字が減少すること」なので、このような減算がないものを選べばよいのではないでしょうか?

選択肢の中で減算がないのはアなので、解答はアとなりました。

ちょっと解説しづらい問題ですねぇ。

難易度(1(易)~5(難))
4

問4 2けたの2進数x1x2が表す整数をxとする。2進数x2x1が表す整数を、xの式で表したものはどれか。ここで、int(r)は非負の実数rの小数点以下を切り捨てた整数を表す。

ア 2x+4int(x/2)
イ 2x+5int(x/2)
ウ 2x-3int(x/2)
エ 2x-4int(x/2)

解答


解説
あまり数式の変換にこだわると時間を掛けてしまう問題です。この手の問題は良く出ますねぇ。
8パターン程度までの計算なら、計算で答えを求めてしまった方が、確実かもしれません。

この問題の場合、以下の4パターンを試せば良いので早速試してみましょう

┌──┬───┬───┬───────┬─────┐
│ │2進数 │整数 │変換後2進数 │変換後整数│
├──┼───┼───┼───────┼─────┤
│(1) │00 │ 0 │ 00 │ 0 │
├──┼───┼───┼───────┼─────┤
│(2) │01 │ 1 │ 10 │ 2 │
├──┼───┼───┼───────┼─────┤
│(3) │10 │ 2 │ 01 │ 1 │
├──┼───┼───┼───────┼─────┤
│(4) │11 │ 3 │ 11 │ 3 │
└──┴───┴───┴───────┴─────┘

(1) 00
ア 2・0+4int(0/2) = 0
イ 2・0+5int(0/2) = 0
ウ 2・0-3int(0/2) = 0
エ 2・0-4int(0/2) = 0
とりあえず、脱落した選択肢はありませんねぇ。

(2) 01
ア 2・1+4int(1/2) = 2
イ 2・1+5int(1/2) = 2
ウ 2・1-3int(1/2) = 2
エ 2・1-4int(1/2) = 2
ここでも、脱落した選択肢はありませんねぇ。

(3) 10
ア 2・2+4int(2/2) = 8
イ 2・2+5int(2/2) = 9
ウ 2・2-3int(2/2) = 1
エ 2・2-4int(2/2) = 0
この時点で、ウが解答のようですねぇ。

(4) 11
ア 2・3+4int(3/2) = 10
イ 2・3+5int(3/2) = 11
ウ 2・3-3int(3/2) = 3
エ 2・3-4int(3/2) = 2
これで、ウを正解にして良いでしょう。

余談ですが、この手の問題は計算ミスなどのケアレスミスに注意してください。
ケアレスさえ防げれば、解答が得られるチャンス問題みたいなものです。

難易度(1(易)~5(難))
1

問5 XとYの否定論理積X NAND Yは、NOT(X AND Y)として定義される。X OR YをNANDだけを使って表した論理式はどれか。

ア ((X NAND Y) NAND X) NAND Y
イ (X NAND X) NAND (Y NAND Y)
ウ (X NAND Y) NAND (X NAND Y)
エ X NAND (Y NAND (X NAND Y))

解答


解説
この問題も、あまり数式の変換にこだわると時間を掛けてしまう問題です。
以下の4パターンで試してみます。

┌──┬─┬─┬─┐
│ │X │Y │OR│
├──┼─┼─┼─┤
│(1) │0 │0 │ 0│
├──┼─┼─┼─┤
│(2) │0 │1 │ 1│
├──┼─┼─┼─┤
│(3) │1 │0 │ 1│
├──┼─┼─┼─┤
│(4) │1 │1 │ 1│
└──┴─┴─┴─┘

(1) X=0 Y=0 OR=0
ア ((0 NAND 0) NAND 0) NAND 0 = (1 NAND 0) NAND 0 = 1 NAND 0 = 1 ×
イ (0 NAND 0) NAND (0 NAND 0) = 1 NAND 1 = 0 ○
ウ (0 NAND 0) NAND (0 NAND 0) = 0 ○ (イと同じなので途中は省略)
エ 0 NAND (0 NAND (0 NAND 0)) = 0 NAND (0 NAND 1) = 0 NADN 1 = 1 ×

(2) X=0 Y=1 OR=1
ア ((0 NAND 1) NAND 0) NAND 1 = (1 NAND 0) NAND 1 = 1 NAND 1 = 0 ×
イ (0 NAND 0) NAND (1 NAND 1) = 1 NAND 0 = 1 ○
ウ (0 NAND 1) NAND (0 NAND 1) = 1 NAND 1 = 0 ×
エ 0 NAND (1 NAND (0 NAND 1)) = 0 NAND (1 NAND 1) = 0 NAND 0 = 0 ×

と、ここまでで解答はイとわかりました。念のため(3)、(4)もやっておきましょう。

(3) X=1 Y=0 OR=1
ア ((1 NAND 0) NAND 1) NAND 0 = (1 NAND 1) NAND 0 = 0 NAND 0 = 1 ○
イ (1 NAND 1) NAND (0 NAND 0) = 0 NAND 1 = 1 ○
ウ (1 NAND 0) NAND (1 NAND 0) = 1 NAND 1 = 0 ×
エ 1 NAND (0 NAND (1 NAND 0)) = 1 NAND (0 NAND 1) = 1 NAND 1 = 0 ×

(4) X=1 1=1 OR=1
ア ((1 NAND 1) NAND 1) NAND 1 = ( 0 NAND 1) NAND 1 = 1 NAND 1 = 0 ×
イ (1 NAND 1) NAND (1 NAND 1) = 0 NAND 0 = 1 ○
ウ (1 NAND 1) NAND (1 NAND 1) = 1 ○
エ 1 NAND (1 NAND (1 NAND 1)) = 1 NAND (1 NAND 0) = 1 NAND 1 = 0 ×

難易度(1(易)~5(難))
1