20230514基本情報技術者試験的な備忘録 2017年(平成29年) 春午前 問5 アルゴリズム
アルゴリズム素人です。
基本情報技術者試験素人です。
以下違いだらけです。自分用メモ。(本格的な解説ではありません。)
参考問題:
基本情報技術者試験 午後 2017年(平成29年) 春午前 問5 アルゴリズム
問題の画像は、IPA様、過去問道場様より引用しました。
(問題あれば削除いたします。)
この問題の答えは、「ア」です。
aの空欄・・・ Yの第0ビット
bの空欄・・・ Xを1ビット左シフト、Yを1ビット右シフト
過去問道場様の解説を読む。それと、過去問道場様のページに載っていたプログラム(javascript)をやってみる。(ありがたいです。)
それでもなんとなくしっくりこなくて記事を書いている始末・・・。
基本は、「論理シフト」。
2進数で、
1ビット左シフトすると2倍
1ビット右シフトすると1/2倍。(これらがキホン)
で、10進数「3×3」を考えてみる。
(以下、細かくは書きません。メモ)
2進数だと、それぞれ
X 0011
Y 0011
になる。(桁数は割愛)
まず、回答aの 「Yの第0ビット:1」 のところの意味
Yが、001「1」だったら、下記の
(Z+X) → Z
をすることになる。(加算)
で、
X 0011(全体3)
Y 000「1」(1なら足すぞ)
と考え、Zが3になる。(X(全体3)がY(1)で該当なのでZ(元0)に入れる)
で、次に、回答bの 「Xを1ビット左シフト、Yを1ビット右シフト」 のところの意味
後半の「Yを1ビット右シフト」は、ループして回答aの 「Yの第0ビット:1」を2桁目に使用するための処理。
Y 00「1」1→000「1」(1なら足すぞ)
前半の「Xを1ビット左シフト」は、
X 0011→0110(全体6)になり、
計算
X 0110(全体6)
Y 000「1」(1なら足すぞ)
と考え、Zが合計9になる。(X(全体6)がY(1)で該当なのでZ(元3)に合算)
でも、何で、「Xを1ビット左シフト」するの?ということになってしまう。
結果から言えば、計算上「Yを1ビット右シフト」したからということなのだが、納得しにくい。
+++++++++++++++++++++++++++++++++++
アルゴリズムで考えなければ単純で、
X 0011
Y 0011
の掛け算の場合、
X 0011
Y 001「1」←1桁目の1を処理
Xは、全体3。で1(2進数の1ビット目の重み)を掛ける。で3
X 0011
Y 00「1」1←2桁目の1を処理
Xは、全体3。で2(2進数の2ビットの重み)を掛ける。で6
で3+6 =9
*************************************
4×3でも同じ
X 0100
Y 0011
X 0100
Y 001「1」←1桁目の1を処理
Xは、全体4。で1(2進数の1ビット目の重み)を掛ける。で4
X 0100
Y 00「1」1←2桁目の1を処理
Xは、全体4。で2(2進数の1ビット目の重み)を掛ける。で8
で4+8 =12
なんとなくそんな感じで納得。??