平成24年度 秋期 午前 問1
離散数学
算術シフトに関する問題
8ビットの2進数 11010000 を右に2ビット算術シフトしたものを,00010100 から減じた値はどれか。ここで,負の数は2の補数表現によるものとする。
- ア00001000
- イ00011111
- ウ00100000
- エ11100000
答えと解説を見る
✓ これが正解ウ00100000
解説
算術シフトは符号を保つので−12となり、20−(−12)=32です。
2進数を右へずらす操作には二つの種類があり、空いた上位の桁に何を詰めるかが違います。ここでの軸は二つです。一つ目は詰める値で、算術シフトは符号を表す先頭の桁と同じものを補うので、負の数はずらした後も負の数のままです。二つ目は引き算の向きで、どちらから何を引くのかを設問の言葉どおりに読み取ります。実際に追うと、11010000は先頭が1なので、2の補数として読めば−48です。右へ2桁の算術シフトを行うと先頭の1が補われて11110100、つまり−12になります。00010100は20ですから、20から−12を引くと32となり、8桁で表せば00100000です。負の値を引くことは足すことと同じだ、という点がこの問題の勘所です。
ほかの選択肢はなぜ違うのか
- ア00001000:この値は10進数の8で、ずらした結果を正の12とみなして20から取り去ると出てきます。先頭の桁と同じ値を補う操作では、押し出した後も符号は変わりません。
- イ00011111:この値は10進数の31です。符号を裏返すときにビットを反転しただけで1を加え忘れると11になり、これを20に足すと31に届きます。反転の後に1を加えるのが決まりです。
- エ11100000:この値は10進数の−32で、引く向きを取り違えて−12から20を取り去った場合に出ます。空いた桁へ一律に0を詰める種類の操作を使っても、同じ値になります。
出典:平成24年度 秋期 基本情報技術者試験 午前 問1
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)