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が負数であったことから来ているのですか?
No.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
とかいったテクニックがありますよね?
No.3
- 回答日時:
> 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の補数を放り込むと、そのままで減算の演算もできちゃうって点です。
他の表現方式だと、一番上の符号を見て加算と減算を場合分けとか、めんどくさいです。
不思議に感じたのですが回答者さんが2の補数から1引いて1の補数にしその数値を反転させた結果と2の補数を反転させ1の補数にしその数値に1を加えた結果が等しいのはなぜなんでしょう?
1を引くのと1を加えるのは全く違いますが反転の作業を挟むことで同じ結果になるのが不思議です。回答者さんは2の補数から1引いて1の補数にすると書かれていますが、そうすると反転=-1ということになるのでしょうか?
No.2
- 回答日時:
> 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
1. 2の補数表現した値+2の補数表現した値=2の補数表現した値とありますが48-52を2進数で計算する際に2の補数になるのは-52だけではないんですか?
3の質問に対して解説されているように-52を2の補数にすると自動的に48も2の補数として考えるのでしょうか?
3.この式にのとって考えると2進数11111100=a 00000011=a' 00000100=Cという関係ですか?
No.1
- 回答日時:
> 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って言うのはどう思いますか?
1.2→分かりました
4.→負数になっているので各桁を反転するという作業が具体的に何をしているのかイメージが湧きません。例えて下さった式がおかしいのは分かりますが2の補数の各桁を反転することとの共通点が掴めません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 計算機科学 ビット計算 2 2023/04/16 14:26
- 数学 以下の問題が分かりません。 8ビット浮動小数点数が、最上位ビットから順に符号1ビット、指数部3ビット 4 2023/07/22 16:06
- 計算機科学 2進数の計算について 2進数の値は全て8ビットで負数は2の補数形式とする。結果が8ビットで表現出来な 3 2023/07/22 14:08
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- その他(データベース) 4進数風なバーコードは何ですか? 2 2022/11/28 23:33
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
- 計算機科学 6ビット(符号含む)の二進数 4 2023/04/16 13:22
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- Excel(エクセル) エクセルのセルの書式設定・ユーザー定義の条件設定について 1 2022/08/17 21:56
- 数学 大学数学 「条件:t進表現において、何乗しても右から2桁が変わらない2桁の自然数が存在する。」 上記 7 2023/06/28 22:25
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
至急!尿検査前日にオナニーし...
-
尿検査前日に自慰行為した時の...
-
白血球が多いとどんな心配があ...
-
尿検査の前日は自慰控えたほう...
-
検便についてです。 便は取れた...
-
納豆食べた後の尿の納豆臭は何故?
-
腕を見たら黄色くなってる部分...
-
彼女のことが好きすぎて彼女の...
-
EXCELで条件付き書式で空白セル...
-
2つの数値のうち、数値が小さい...
-
精子が黄色?
-
変な話しになります。尿検査で...
-
勃起する時って痛いんですか? ...
-
エクセル指定した範囲からラン...
-
小数点以下を繰り上げたものを...
-
excelでsin二乗のやり方を教え...
-
エクセルのラベルの値(文字列...
-
リンク先のファイルを開かなく...
-
1日前の検尿
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
至急!尿検査前日にオナニーし...
-
首吊りどこ締めるの
-
尿検査の前日は自慰控えたほう...
-
尿検査前日に自慰行為した時の...
-
検便についてです。 便は取れた...
-
白血球が多いとどんな心配があ...
-
中出しをするとお腹が痛い・・・。
-
射精をして1週間以内に尿検査を...
-
彼女のことが好きすぎて彼女の...
-
腕を見たら黄色くなってる部分...
-
勃起する時って痛いんですか? ...
-
変な話しになります。尿検査で...
-
これって喉仏ですか? 私は女性...
-
EXCELで条件付き書式で空白セル...
-
男です。昨日の午後3時くらいに...
-
今朝、毎朝の習慣でオナニーし...
-
納豆食べた後の尿の納豆臭は何故?
-
1日前の検尿
-
値が入っているときだけ計算結...
-
精子が黄色?
おすすめ情報
反転の意味がやっとわかりました不完全補数は元の値に足すとその桁数での最大値にならなくてはいけないから反転して0と1を噛み合わせて1だけの数値にするという操作が反転ですね。