HOME»基本情報技術者試験掲示板»令和元年秋期午後問8の左論理ビットの問いについて
投稿する

[3324] 令和元年秋期午後問8の左論理ビットの問いについて

 ぱんさん(No.1) 
https://www.fe-siken.com/kakomon/01_aki/pm08.html
こちらの問いについて、1にさせたいビットを下位からずらしていくということで左論理ビットしていくというところまでは理解しましたが、なぜiビットではなく(i−1)ビットという答えになるのかが理解できません。

どなたか解説をしていただけると助かります。
よろしくお願いいたします。
2021.05.21 23:24
さん(No.2) 
おそらくぱんさんが、わからないとおっしゃっている問題は、問1のCだと思いましたので僕なりの解説を書いておきます。((日本語が下手なので分かりづらかったら申し訳ないです。
空欄Cに関して、行っているのは、Mask[1]〜[26]の作成です。Maskは[1]が"A",[2]が"B",[3]が"C"と、配列番号と英一文字が対応しています。
Mask[]の中の"1"の個数と、Patの中の英一文字が対応しています。例:Mask[1]なら、0000000000010101となっていて、Patの中の"A"の文字の個数は3文字です。Maskの中の"1"の数とPatの中の文字の個数が対応しています。。理解してくださいお願いします。。。
そして、今回空欄Cを求める時は、Maskを作成するということで、なるべくMaskの中の"1"の個数が少ないMask[]を選びます。一番"1"の個数が少ないのは、Mask[3]の0000000000000010です。
Patの中で"C"が出てくるのは、要素番号2なので、iが2の時"C"がきます。
プログラム1の5行目の”Mask[Index(Pat[i])]←CとMask[Index(Pat[i])]の論理和”をみます。今回はPatの"C"でやるので、i=2ですよね。((上に書きました。分からない場合は見直してください。。))
ここで肝となるのは、1Bをどれだけ左シフトしたら0000000000000010になるかです。この場合は左に1つ左シフトしたら0000000000000010になりますよね。
なので、i-1です。

こんな文章で理解が苦しいとは思われますが、頑張って書いたのでまた分からないところがあれば、投稿してください!答えますので。
2021.05.22 00:04
 ぱんさん(No.3) 
お  さん
丁寧に解説いただき本当にありがとうございます!
そして失礼しました、おっしゃる通り空欄Cに関してです。

解説いただいた
「Patの中で"C"が出てくるのは、要素番号2なので、iが2の時"C"がきます。」
までは理解できました!!
なのですが、"1B"というのはどこから出てきたのでしょうか・・
そして、”Mask[Index(Pat[i])]←CとMask[Index(Pat[i])]の論理和”というのがなにをやっているのかわからず・・

"C"の場合だと
・Mask[Index(Pat[2])]:Pat[2]が"C"で、それをIndexしているのは3番目だからMask[2]が10
・それとビットごとの論理和ということは問Cの解答"10"と上の10の論理和ということは結局Mask[Index(Pat[2])]は"10"ということになりますか??

再びの質問すみません・・よろしくお願いいたします!
2021.05.22 09:29
山Bさん(No.4) 
横から失礼します。一つ気づいたのはpat(2)はcで、index(pat(2))→index(c)は、3です。なぜなら、問題文に「関数indexは、引数にアルファベット順でn番目の英大文字を設定して呼び出すと、整数n(1≦n≦26)を返す」とあり、cは3番目のアルファベットだからです。
2021.05.22 12:57
山Bさん(No.5) 
つまり、mask[index(pat[2])]→mask[index(c)]→mask(3)です。
2021.05.22 13:06
山Bさん(No.6) 
論理和のところは、
i=1
→mask[index(pat[1])]→mask[index(a)]→mask[1]で、i-1は0なので左シフト無しの1とmask(1)初期値0との論理和1。

i=2
→mask[index(pat[2])]→mask[3]で、mask(3)初期値0と1bを2-1=1だけ論理左シフトした10との論理和10

i=3
→mask[index(pat[3])]→mask[index(a)]→mask[1]で、i-1=2なので、1bを2だけ論理シフトした100と、その前までのmask(1)である1との論理和101にmask(1)が更新される、
と言う具合でしょう。
2021.05.22 13:50
 ぱんさん(No.7) 
山Bさん
解説ありがとうございます!
mask[index(pat[1])]→mask[index(a)]→mask[1]でmask[1]の値は図1のところの10101Bを指していると勘違いしていましたが、初期化されてるから0Bなんですね!

そしてi番目のビットを1にしたいからどっちかが1になればいい
⇒i番目が1とmask[1]の論理和

i=1
0と1の論理和

i=2
0と10の論理和

i=3
0と100の論理和

⇒1から10(i-1ビット論理左シフト)
⇒1から100(i-1ビット論理左シフト)

なんか書いているうちにまとまってきました!
スッキリです!!ありがとうございます!!
2021.05.22 15:14
山Bさん(No.8) 
ぱんさん、

i=3の時は、
mask[index(pat[3])]→mask[index(a)]→mask[1]となり、

1bを3-1=2だけ論理左シフトした100と、それまでのmask[1](→i=1の時のmask[1])である1との論理和の101、ということでしょう。
2021.05.22 16:23

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2010-2024 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop