プロが教える店舗&オフィスのセキュリティ対策術

2進数の減算について

10進数48-52を2進数にして減算する場合、48の2進数+52の2の補数となり結果11111100になるというところまでは分かったのですが、その後で最上位桁が1で負数になっている(2の補数表現)ので各桁を反転し+1して00000100=4。符号をつけて-4とあるのがよく分かりません。

1.なぜ最上位桁が1で負数を表していると2の補数表現なのですか?

2.2の補数表現ではなぜいけないのでしょうか?

3.2の補数表現を正すプロセスが2進数→1の補数→2の補数と同じですが、なぜですか?

4.最終的な結果として得られた00000100=4に勝手に「符号をつけて」-4としても良いのですか?この「符号をつけて」の発想は変換前の11111100が負数であったことから来ているのですか?

質問者からの補足コメント

  • 反転の意味がやっとわかりました不完全補数は元の値に足すとその桁数での最大値にならなくてはいけないから反転して0と1を噛み合わせて1だけの数値にするという操作が反転ですね。

      補足日時:2016/12/04 15:56

A 回答 (4件)

> 1. 2の補数表現した値+2の補数表現した値=2の補数表現した値とありますが48-52を2進数で計算する際に2の補数になるのは-52だけではないんですか?


> 3の質問に対して解説されているように-52を2の補数にすると自動的に48も2の補数として考えるのでしょうか?

「補数表現」と「補数」を混同しないようにしましょう。

補数表現は、
 正の値→ そのまま
 負の値→ 絶対値の補数
という変換をかけて、全てを「正の値」とて扱おうとするものです。
逆に、補数表現したものは
 元の値のまま使われている値→そのまま正の値に
 補数を使った値→ その補数から元の絶対値を求め、-1 倍する
という方法で元に戻ります。

48は2進で 00110000
52は2進で 00110100
00110000 - 00110100
= 00110000 + (-00110100)
 これを「補数表現」を使うと
00110000 は正だからそのまま
  -00110100 は負だから、 絶対値 00110100 の補数をとって 11001100
→ 00110000 + 11001100
= 11111100
 ここで、 11111100 は負の値を「補数表現」したものだから 元の値を求めます。
※ なぜ 11111100 が負の値なのか、はそうなるように決めたから。
 11111100 の補数 は 00000100 なので、これを -1 倍した
-00000100
となります。これは、10進数での -4 になります。

> 3.この式にのとって考えると2進数11111100=a 00000011=a' 00000100=Cという関係ですか?

違います。
2進8桁での2の補数ならば、 C=100000000 (2^8) です。
a=11111100 ならば、
a'=C-a
a'=100000000-11111100
a'=00000100
です。


さて。
・ビットを反転させる
ことは
・同桁の 111...1 から値を引く
ことと同じ、ということは理解できてますか? 2進8桁なら
a のビット反転 = 11111111 - a
です。

また、
11..1 (2進m桁) = 100..0(2進m+1桁) -1
つまり
11..1(2進m桁) = 2^m -1
であり、上で2の補数を求めるのに使ったCを使うと
11..1(2進m桁) = C -1
になります。
以上を合せると
a のビット反転 = (C-1) - a
となります。

aの2の補数を求める式は
C-a
です。これを
C-1 - a +1 = ((C-1) -a ) +1
と変形すれば「 a を反転( (C-1) -a ) してから +1 する」 となります。
C-1 - a +1 = (C-1) -(a -1)
と変形すれば「 a から1引いてから反転する」 となります。
※ 反転と +1/-1の順番に注意。「反転して-1」「+1してから反転」は別なものになります。

反転して+1とか、-1して反転とかは、計算するためのテクニックでしかありません。
10進数でも
9 +5 = 9+1 + 5-1 = 10 +4
とかいったテクニックがありますよね?
    • good
    • 0
この回答へのお礼

(・・;)ちょっとムズカシイデス

お礼日時:2016/12/04 22:46

> 2の補数の各桁を反転することとの共通点が掴めません。



2の補数で負数を表現している時に、10進数でいくつかわかりにくいから、一度反転して符号のない整数部分を考える。
負の10進数を2の補数で表すときに暗算できないので、正の10進数を一度考えて反転したり1足したり。
とか、計算上の都合です。


例えば、
次の2の補数表現の負数は、10進数でいくつ?
11010011

って言われてパッと答えられればいいんですが、フツーはそうでないので、
1引いて1の補数表現で表して、
11010010
反転して10進数の正の部分は、
00101101
32 + 0 + 8 + 4 + 0 + 1 = 45
なので、元の負数は-45とかってのがフツーの計算です。

--
反転とか1足すとか引くとかって機械的な暗記はキライなので、自分は、

2進数の△△△△△の1の補数☆☆☆☆☆は、
△△△△△
☆☆☆☆☆(+
――――――――――――
11111

になる数、結果ビット反転したモノ。
1桁の2進数で考えると、△+☆=1になる数。1を補う数。


2進数の△△△△△の2の補数◇◇◇◇◇は、
 △△△△△
 ◇◇◇◇◇(+
 ――――――――――――
100000

になる数
1桁(ないし2桁)の2進数で考えると、△+◇=10になる数。すなわち2(10)を補う数。

って覚えてます。

--
で、2の補数の何が便利なのか、何で2の補数使うのかというと、
例えば質問者さんが電子工作で4ビットの正の数を扱える加算機作ったとして、
┌─△
├─△
├─△
├─△

┤△△△△
┤◇◇◇◇(+
┤―――――――――
┤????

├─◇
├─◇
├─◇
└─◇
ここに2の補数を放り込むと、そのままで減算の演算もできちゃうって点です。
他の表現方式だと、一番上の符号を見て加算と減算を場合分けとか、めんどくさいです。
    • good
    • 0
この回答へのお礼

不思議に感じたのですが回答者さんが2の補数から1引いて1の補数にしその数値を反転させた結果と2の補数を反転させ1の補数にしその数値に1を加えた結果が等しいのはなぜなんでしょう?
1を引くのと1を加えるのは全く違いますが反転の作業を挟むことで同じ結果になるのが不思議です。回答者さんは2の補数から1引いて1の補数にすると書かれていますが、そうすると反転=-1ということになるのでしょうか?

お礼日時:2016/12/04 14:52

> 1.なぜ最上位桁が1で負数を表していると2の補数表現なのですか?



「2の補数表現した値」+「2の補数表現した値」=「2の補数表現した値」
という性質を利用しているのですから、
 結果11111100
は「2の補数表現した値」になっています。



> 3.2の補数表現を正すプロセスが2進数→1の補数→2の補数と同じですが、なぜですか?

元の値と、その補数は、互いの補数の関係になります。
a とその補数 a' とすると
a + a' =C
という関係があり、
a' = C - a
で求められるのが「aの補数 a'」です。
同様に
a = C - a'
となるので、「a'の補数a」でもあります。







少し前に補数について質問があって、いろいろ書いたので参考に。
https://oshiete.goo.ne.jp/qa/9445854.html
    • good
    • 0
この回答へのお礼

1. 2の補数表現した値+2の補数表現した値=2の補数表現した値とありますが48-52を2進数で計算する際に2の補数になるのは-52だけではないんですか?
3の質問に対して解説されているように-52を2の補数にすると自動的に48も2の補数として考えるのでしょうか?

3.この式にのとって考えると2進数11111100=a 00000011=a' 00000100=Cという関係ですか?

お礼日時:2016/12/04 14:19

> 1.なぜ最上位桁が1で負数を表していると2の補数表現なのですか?



いえ。
2の補数で計算したから、結果の11111100が2の補数で表現されてますよって話では。
計算結果が10進数、上だと48-52の結果が一千百万いくつになってたらどうよ?とか想像してみるとか。


で、結果の11111100の2の補数って、10進でいくつよ?って考える時に、

> 2.2の補数表現ではなぜいけないのでしょうか?

問題が、「計算結果を2の補数で表せ」ならいいですが、正負の10進数で表さなきゃならないからでは。


> 4.最終的な結果として得られた00000100=4に勝手に「符号をつけて」-4としても良いのですか?この「符号をつけて」の発想は変換前の11111100が負数であったことから来ているのですか?

そこに行く前に、

> 負数になっている(2の補数表現)ので各桁を反転し

してるんだから、00000100は最終的な計算結果ではないです。

例えば、
-16-19-35
=-(16+19+35)

ここで、
16+19+35=70

って計算して、最終的な答えは70って言うのはどう思いますか?
    • good
    • 0
この回答へのお礼

1.2→分かりました
4.→負数になっているので各桁を反転するという作業が具体的に何をしているのかイメージが湧きません。例えて下さった式がおかしいのは分かりますが2の補数の各桁を反転することとの共通点が掴めません。

お礼日時:2016/12/04 12:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!