HOME»基本情報技術者試験掲示板»平成24年秋期  問1について
投稿する

平成24年秋期  問1について [5533]

 勉強中さん(No.1) 
https://www.fe-siken.com/kakomon/24_aki/q1.html

解説にある通り
2進数11010000を2ビット算術シフトして2の補数表現した結果が
00001100  =  -12(10進数)になることは分かるのですが
この後の手順について質問させてください。

以下の考え方をして誤答してしまいました。
00010100  =  20(10進数)となるため
20+(-12)=8(10進数)=00001000(2進数)
※参考書などには「補数を使用する最大のメリットは、”足し算で引き算ができる”」
  「コンピュータは引き算ができないため足し算を利用して引き算の計算をして」いる
  との記載があるので足し算で解を求めるものと理解していました。

これを10進数を経由せずに2進数の足し算として考えると
00010100  +  00001100  =  00100000
となり正答にたどりつけるのですが
10進数で計算したときに何故間違えてしまうのかが分かりません。
本番で同様の問題がでても10進数に直してから計算して回答しようとすると思います。
※2の補数の計算を10進数で考える場合には
  必ず絶対値計算しなければならないのでしょうか?

2の補数についての理解が足りてないが故の質問だとは思いますが
分かる方教えていただけると助かります。
よろしくお願いします。
2024.07.21 13:20
y4 kさん(No.2) 
FE ブロンズマイスター
>2進数11010000を2ビット算術シフトして2の補数表現した結果が
>00001100  =  -12(10進数)になることは分かるのですが

ここ。符号ビットが0なので正の値で考えるべきですよ。
つまり符号ビット1の値(負)を2の補数表現したので、この時点で正の値になります。
10進数で計算するなら20+12=32
これを2進数にするだけです。
2024.07.21 13:44
y4 kさん(No.3) 
FE ブロンズマイスター
補足
2の補数って、正値を負値へ変換するだけではないです。
負値を正値へ変換することもできます。
2024.07.21 14:02
boyonboyonさん(No.4) 
FE シルバーマイスター
設問を書き換えると、
「11110100を00010100から減じる。」
になります。
対応する10進数は
11110100    ー12
00010100    20
なので、設問は
「-12を20から減じる。」
となります。
20-(-12)=32
2進数表記では、
00100000
になります。

次のように考えてみては如何でしょうか。
2進数        対応する10進数
00001100      12
対応する2の補数は、
11110100      -12
続けて、11110100に対応する2の補数は、
00001100      ー(ー12)=12
2024.07.21 18:10
jjon-comさん(No.5) 
FE ゴールドマイスター
この投稿は投稿者により削除されました。(2024.07.21 21:41)
2024.07.21 21:41
jjon-comさん(No.6) 
FE ゴールドマイスター
8ビットの2進数11010000を右に2ビット算術シフトしたもの(11110100,10進数では-12)を,00010100(10進数では20)から減じた値
ですから,
20+(-12)=
ではなく
20-(-12)=
になることはNo.4の解説どおり。

> コンピュータは引き算ができないため
というのは誤解を生みやすい説明だと思います。
負数を表すのに2の補数表現を採用すれば,加算の仕組みとは別に減算の仕組みを導入することなく,加算の仕組みだけで減算が実現できるということです。

ですから,
20-(-12)=
という10進数の演算も加算の仕組みだけで実現できます。その場合,10の補数表現について学ぶことになります。

> 10進数で考える場合には必ず絶対値計算しなければならない
わけではありません。
ただ,10の補数や9の補数は,補数とは何かを理解するためには面白い知識ですけれど,基本情報技術者試験の合格を目指す勉強からすると必須の知識ではないです。
2024.07.21 21:44
 勉強中さん(No.7) 
y4 k  様
補足も含めての解説ありがとうございます。

> つまり符号ビット1の値(負)を2の補数表現したので、この時点で正の値になります。
反転させた時点で正の値になる
なるほど言われてみれば確かにそうですね。

それならば単純に正の値での足し算になるので32を2進数に直せば
正答できますね

ありがとうございました。
2024.07.21 23:17
 勉強中さん(No.8) 
boyonboyon  様
解説ありがとうございます。

10進数で考える場合は変に足し算することを意識せずに
言葉通りに受け取って
> 「-12を20から減じる。」
ため
> 20-(-12)=32  2進数表記では、00100000になります。
というわけですね。
考え方のご教授もありがとうございます。
2回2の補数をとると結局マイナスのマイナスでプラスになる
ということですね。
参考になりました。
ありがとうございました。
2024.07.21 23:17
 勉強中さん(No.9) 
jjon-com  様
解説ありがとうございます。

> 負数を表すのに2の補数表現を採用すれば
> 加算の仕組みとは別に減算の仕組みを導入することなく
> 加算の仕組みだけで減算が実現できるということです。
この考え方が普段やらないような考え方なので
慣れるまですごく不思議な気分というか混乱してしまいます。

>> 10進数で考える場合には必ず絶対値計算しなければならない
> わけではありません。
> ただ,10の補数や9の補数は補数とは何かを理解するためには面白い知識ですけれど
> 基本情報技術者試験の合格を目指す勉強からすると必須の知識ではないです。
必ずしも絶対値計算となるわけではないのですね。
10の補数や9の補数も時間があれば勉強して理解を深めたいところなのですが
その時間が取れるかどうか・・
過去問を解いていて理解しなければならない時が来れば勉強したいと思います。
ありがとうございました。
2024.07.21 23:19
 勉強中さん(No.10) 
このような問題の場合は
時間があればですが
10進数での計算結果と2進数での計算結果を突合できるので
どちらかの計算方法にミスがあった場合
気付けるはず・・・
面倒くさがらずに時間の許す限りは
自分の回答チェックも可能な限り行っていこうと思います。
2024.07.21 23:30
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop