2の補数を求めるアルゴリズムについて

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
SUTさん  
(No.1)
令和05年(上期)パーフェクトラーニング予想問題集をやっているのですが、分からないところがあるため質問です。
平成15年度の応用情報の試験に出ていた問題の類似問題です。
変数「SW」が何を意味しているのか理解できないためトレースできずに行き詰っております。
お知恵かしていただけると幸いです。

試験まで1カ月切っているのですが、この辺りの問題(2進数関連のアルゴリズム)で基本全部つまづいてしまい情けない限りですが、よろしくお願いいたします。
二進数の問題を見るだけで鳥肌が立ってきます…
尚2の補数ということなので、二進数全ての値で0と1を入れ替えて1の補数を求め、
そこに1を加えるというのは理解できます。

以下問題です。

【問題】
8ビットの2進数の各けたを,下位けたから順に,配列BITの要素1~8に格納してある。次の流れ図は配列BIT内の2進数の2の補数を求める方法を表したものである。ここで用いる方法は,下位けたから調べていき,最初に表れる1までは何もしないで,次のけたから0と1を反転させるものである。
例えば,2進数 10101000 は 01011000 に変換されることになる。
空白[a]に当てはまる内容として適切なものはどれか。
尚ここで配列の要素番号は1から始まるものとする。

【プログラム】
整数型配列:BIT
整数型:SW,i

SW←0
for(iを1から8まで1ずつ増やす)
if(BIT(i)が1と等しい)
if(SWが0と等しい)
SW←1

else
BIT(i)←0
endif

else
if(SWが0と等しい)
「          a            」

else
BIT(i)←1

endif
endif
endfor

選択肢
ア.BIT(i)←1
イ.SW←1
ウ.SW←1.BIT(i)←1
エ.何もしない
2024.02.18 14:50
まきさん 
(No.2)
>スレ主さん
https://www.fe-siken.com/bbs/5296.html
同じスレ作成したので参考にしてください
2024.02.18 15:24
まーぼさん 
FE ブロンズマイスター
(No.3)
変数SWはswitchの略で、最初に現れる1を見つけたかどうかを管理する変数だと思われます。(sw=0でまだ1が現れていない、sw=1で1が既に現れている状態)。

>尚2の補数ということなので、二進数全ての値で0と1を入れ替えて1の補数を求め、
そこに1を加えるというのは理解できます。

とありますが、このプログラムではこの方法とは少し違う方法で2の補数を求めていると思います。私はSUTさんが仰っている方法が一般的な2の補数の求め方だと思います。
2024.02.18 15:53
jjon-comさん 
FE ゴールドマイスター
(No.4)
次のスレッドの No.6 を参照。
https://www.fe-siken.com/bbs/5305.html

上記より、あるビット列(例:10101000)が
符号なし2進数であり、そこから1を減算するということは、
次のアルゴリズムで実現できます。

(1) そのビット列を右端から調べていき、
最初に見つけた1までの[右側]と、それ以降の(左側)に分ける。
(1010)[1000]

(2a)
[右側]はビット反転し、(左側)はそのまま。
(1010)[0111] …符号なし2進数から-1した解答

----
そのビット列が2の補数を用いた符号あり2進数であり、
そこから1を減算するのであれば、次のアルゴリズムで実現できます。

(1) そのビット列を右端から調べていき、
最初に見つけた1までの[右側]と、それ以降の(左側)に分ける。
(1010)[1000]

(2b)
(左側)はビット反転し、[右側]はそのまま。
(0101)[1000] …符号あり2進数(2の補数形式)から-1した解答

----
以上より、

> 2の補数ということなので、二進数全ての値で0と1を入れ替えて
> 1の補数を求め、そこに1を加えるというのは理解できます。

という基本はそのとおりなのだけれど、

ビット列を右端(最下位)から調べていく方法が使えるのなら
次のアルゴリズムで2の補数への変換を実現できます。

(a) 初期は「初めての1をまだ見つけていない状態」
    SW←0
(b) 初めての1が見つかるまでは、ビット列はそのまま
    if (SWが0と等しい) 何もしない
(c) 初めての1が見つかったら「初めての1を見つけた状態」へ切替
    if(BIT(i)が1と等しい) if(SWが0と等しい) SW←1
    ちなみにこの「初めての1」もそのままで反転しません。ここで[右側]は終了。
(d) 以降はすべて(左側)なのでビット反転。
    else BIT(i)←0 endif、else BIT(i)←1 endif
2024.02.18 17:53
SUTさん  
(No.5)
>>皆様
貴重なご意見ありがとうございます。
見たこともない変数が出てきて、何だろう?と慌ててしまいました。

SWの意味と補数の仕組みを理解しつつ、1つずつトレースしてみたら解くことが出来ました。

補数の仕組みをもう一度しっかり理解して試験に臨もうと思います。

ありがとうございました。
2024.02.20 12:16

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop