平成23年度 秋期 午前 問1
離散数学
16進数に関する問題
16ビットの2進数 n を16進数の各桁に分けて,下位の桁から順にスタックに格納するために,次の手順を4回繰り返す。a,b に入る適切な語句の組合せはどれか。ここで,XXXX₁₆ は16進数 XXXX を表す。
〔手順〕 (1) [ a ]を x に代入する。 (2) x をスタックにプッシュする。 (3) n を[ b ]論理シフトする。
| a | b | |
|---|---|---|
| ア | n AND 000F₁₆ | 左に4ビット |
| イ | n AND 000F₁₆ | 右に4ビット |
| ウ | n AND FFF0₁₆ | 左に4ビット |
| エ | n AND FFF0₁₆ | 右に4ビット |
- アa=n AND 000F₁₆ / b=左に4ビット
- イa=n AND 000F₁₆ / b=右に4ビット
- ウa=n AND FFF0₁₆ / b=左に4ビット
- エa=n AND FFF0₁₆ / b=右に4ビット
答えと解説を見る
✓ これが正解イa=n AND 000F₁₆ / b=右に4ビット
解説
下位4ビットを取り出し、右に4ビットずらします。
16進数の1桁は、ちょうど2進数の4桁ぶんの情報を持ちます。ですから16ビットの値を16進の4桁に分けるには、下から4ビットずつ切り出していけばよいことになります。切り出しに使うのは、必要なところだけを1にした値との論理積です。取り出したい部分に当たるビットが1、それ以外が0になっていれば、その部分だけが残り、ほかは0になります。取り出したあとは、次に取り出したい桁を同じ位置まで運んでこなければなりません。そこで値を4ビットぶん送る論理シフトが必要です。判定の軸は二つです。一つは、掛け合わせる値の1が立っている位置が、取り出したい下位側にそろっているかどうか。もう一つは、送る向きが、まだ取り出していない上位の桁を下位側へ引き寄せる向きになっているかどうかです。向きを取り違えると、取り出し済みの側へ値が流れ、上位の桁は器からあふれて失われます。
ほかの選択肢はなぜ違うのか
- アa=n AND 000F₁₆ / b=左…:掛け合わせる値は下位の4桁だけを残す形になっていて、そこは合っています。しかし送る向きが逆です。上位側へ送ると、まだ取り出していない桁が器の外へあふれ、空いた下位側には0が入ってきます。
- ウa=n AND FFF0₁₆ / b=左…:残る部分が逆です。上位の12桁だけを残す値を掛け合わせると、取り出したい下位の1桁が0になって消えてしまいます。送る向きも上位側なので、次の桁が下位へ降りてきません。
- エa=n AND FFF0₁₆ / b=右…:送る向きは合っていますが、残す部分が逆です。上位の12桁を残す値を掛け合わせると、積む値が16進の1桁ぶんにならず、下位の4桁がそろって0になってしまいます。
出典:平成23年度 秋期 基本情報技術者試験 午前 問1(改変:原典の図表をテキストに書き起こした)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)