平成18年 秋期 基本情報技術者 午前 問2

数値を2進数で格納するレジスタがある。
このレジスタに正の整数x を設定した後、“レジスタの値を2ビット左にシフトして、x を加える”操作を行うと、レジスタの値はx の何倍になるか。
ここで、シフトのあふれ(オーバフロー)は、発生しないものとする。

 ア  3
 イ  4
 ウ  5
 エ  6


答え ウ


解説
まず『レジスタの値を2ビット左にシフト』を考えます。
操作する値が00001bという値の場合に1ビット左にシフトすると
 0001b
   ↓
 0010b
と、元の数字を1けた左に移動し、最下位ビットに0が加える事です。
これを10進数として考えると、0001bの1が0010bの2になっていますから2倍になっています。(左1ビットシフト=2倍です。)
※逆に右に1ビットシフトは1/2倍になります。

問題は2ビット左にシフトですから0001b(1)→0100b(4)で4倍になります。

次に問題には『x を加える』とありますから、さらにx を加えますので、0001b(1)(2ビット左シフト)→0100b(4)(x を加える)→0101b(5)なので5倍(ウ)になります。

『あふれ(オーバフロー)』について考えましょう、問題では発生しないとなっていますが、現実のコンピュータでは発生しますので、知っていて損にはならないです。
レジスタのサイズが8ビット とすると、このレジスタは8ビット以上の値は扱えませんので、演算(シフトなど)して9ビット目が1になると、9ビット目は扱えないので“あふれ”が発生します。
例えば、240=1111 0000bを、2ビット左にシフトすると11 1100 0000b(960)になりますが9ビット目から上は扱えないので、これを“あふれ”(オーバフロー)と呼びます。
今、私たちが普段使用するパソコンはのCPUのレジスタは32ビットや64ビットですから、32ビットで4,294,967,295(約43億)、64ビットで18,446,744,073,709,551,615(大きすぎて読み方がわかりません。)まで表すことができるので、ほとんど気にする必要はありませんが、組込み系(エンベデッドシステム)では未だにレジスタのサイズが8ビットのCPUを使うこともありますので注意が必要です。


キーワード
・シフト
・あふれ

キーワードの解説

戻る 一覧へ 次へ