2012年3月10日土曜日

=== 平成23年秋 問1 ===


平成23年秋目次へ   <<前の問題   次の問題>>

問1

16 ビットの2進数 n を 16 進数の各けたに分けて, 下位のけたから順にスタックに格納するために, 次の手順を4回繰り返す。a,b に入る適切な語句の組合せはどれか。 ここで,XXXX16 は 16 進数 XXXX を表す。

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










解説

2進数の4桁で表現できるのは10進数の0~15であり、これを16進数では0~Fの1桁の数字で表現する。 たとえばnが 0101 1010 1100 0011 であったとする。
これは16進数で表現すると 5AC3である。
問題では16進数の各桁に分けて下位の桁から順にスタックに格納するといっているため、 下の図のように、下位の桁から4桁づつスタックに格納されればよい。

そのためには まず、1番下の4桁だけを取り出しスタックにプッシュしたい。
ある桁だけを取り出すためには、取り出したい桁だけが1となっている数とANDを取ればよい。
そのため、(1)では 0 AND 000F16となる。

次の4桁を取り出すためには、4ビット右にシフトしてから(1)から繰り返せばよい。


ここで、論理シフトと算術シフトの違いを見ておこう。
右への論理シフトとは、そのまま2進数を右に移動し、押し出された部分は消え、左の空いた部分には0が入る。

算術シフトの場合、押し出された部分が消えるのは同様であるが、空いた部分には1番左のビットの値が入る。
負の数は、1番左のビットに1が立っているが、こうすることにより、負の数を右にシフトしても、負のままになる。

1ビット右にシフトすると、2で割った値が求まるが、負の数でもそのようにするためには、算術シフトをする必要がある。

ここでは、単純に4ビット右にずらすだけであるため、論理シフトでよい。
そのため、(3)の答えは右に4ビット論理シフトするとなる。


答え

0 件のコメント:

コメントを投稿