アプリ版:「スタンプのみでお礼する」機能のリリースについて

初めまして。2進数の掛け算で困っています。よろしくお願いします。

10進数で2*(-3)=-6ですが、これを3bitの2進数で行ないたいと思います。
すると、010*101(2の補数)=01010となります。
-6は10(2の補数)となるはずですが答えが異なります。
符号拡張というものがあるということで、次はそれで行なってみます。
010*1101(符号を拡張した2の補数)=011010となります。
答えが異なります。ますますわけがわかりません。
----------
次に10進数で(-1)*(-1)=1ですが、これを2bitの2進数で行ないたいと思います。
すると、11(2の補数)*11(2の補数)=1001となります。
1は1となるはずですが答えが異なります。
符号拡張というものがあるということで、次はそれで行なってみます。
111(符号を拡張した2の補数)*111(符号を拡張した2の補数)=110001となります。
答えが異なります。ますますわけがわかりません。
----------
話は変わるのですが、
Nビット×Mビット=N×Mビットになる
とのことです。これも理解できません。

どなたかご教授をお願いしますm(__)m

A 回答 (3件)

先ず最初に、間違いの指摘を一つ。


>Nビット×Mビット=N×Mビットになる
Nビット×MビットはN+Mビットです。
ビット数を数えることは、(2を底とした)対数演算に置き換えられます。
つまり、Nビット数であるnとMビット数であるmを考えると、
log2(n) = N, log2(m) = Mと置けます。
つまりn×mのビット数はlog2(n×m)となり、log2(n)+log2(m)となります。
更に付け加えると、符号付の場合はNビット×Mビットが(N-1)+(M-1)ビットになってしまいます。
これは符号ビットの分、有効ビット数が減るためです。

さて、最初の問題に取り掛かりましょう。
3ビット * 3ビットの演算とありますが、符号ビットがあるので有効ビットは2ビットになってしまいます。
つまり、010 * 101 = 1010となり、4((3-1)+(3-1))ビットの符号付整数となります。
これは10進数に変換すると-6です。
また、符号拡張した場合も010 * 1101 = 11010という5((3-1)+(4-1))ビットの符号付整数ですからこれも-6になります。

次の問題も同様で、11 * 11 = 01、111 * 111 = 0001と、それぞれ1になります。
    • good
    • 3
この回答へのお礼

素晴らしいとしか言葉が思いつきません!

手計算で検証してみました。
間違いなくその法則に従っています。
もっと深く勉強したくなりました。

似たような例題として、
10(unsinged)*101(singed)を考えてみたい思います。
ここでのポイントは片方しか符合が付いていないことです。

10(符号なし)*101(符号あり)なので、
2+2=4ビットの答えが返ってくることになります。
正しいかどうか、検証しましょう。

10*101=1010です。有効ビットは4ビットなので、そのままにします。
10000-1010=110です。つまり6であると言えます。
1010は10進数で言う-6です。正しいということになります。

お礼日時:2006/11/27 20:35

単純なオーバフローの話と思います。


正式の理論は知らないのですが3ビットで符号付き整数を表せるのは
011=3
010=2
001=1
000=0
111=-1
110=-2
101=-3
100=-4
すなわち、-4~+3までなのです。すなわち、-6は無理なのです。

したがって、問題の計算は4ビット使えば以下のように足ります。
0010*1101=11010=1010=-6(桁あふれのビットは削除)

10進数で(-1)*(-1)=1の計算も同様です。計算は1001ですが上の2つのビットは無いものですから削除して01=1になるのです。
    • good
    • 0
この回答へのお礼

ありがとうございます!

全然そういう考え方を持っていませんでした。
桁あふれのビットを削除という考え方は
使い勝手が良さそうです。

ビットをギリギリまでしか持たずに足し算したりすると
0に戻っちゃう可能性が考えられるので、
余計にビットを持っていて、変化をみればいいですね!

お礼日時:2006/11/27 20:44

後半だけの回答です。



>話は変わるのですが、
>Nビット×Mビット=N×Mビットになる
>とのことです。これも理解できません。

私も理解できません、というかそれ、間違ってます(笑)。
正しくは、
 Nビット×Mビット=N+Mビットになる
ですよ。
10進数で4桁の5000x5000=
2,5000,000で8桁=(4+4)になりますよね。
決して4*4の16桁にはならないでしょ。

この回答への補足

早速のお返事ありがとうございます。
疑問に思うところがあります。
できればご教授をお願いします。

たとえば、100×100=10000(2進数)となりますが、
この場合は、Nが3、Mが3となるので、3+3=6ですが、
答えは5ビットとなっています。

しかし、111×111=110001(2進数)となるので、
この場合は6ビットになります。
桁上がりがあれば…ということでしょうか?

補足日時:2006/11/27 19:45
    • good
    • 0
この回答へのお礼

すいません、補足は削除したいくらいの
ダメな質問でした。1000-100=100ですものね。
本当に恥ずかしいです。

10進数での例題は直感的にすごくわかりやすいです。

ありがとうございました!

お礼日時:2006/11/27 20:47

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