- ベストアンサー
2進数の掛け算ができません
初めまして。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
- みんなの回答 (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になります。
その他の回答 (2)
- endlessriver
- ベストアンサー率31% (218/696)
単純なオーバフローの話と思います。 正式の理論は知らないのですが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になるのです。
お礼
ありがとうございます! 全然そういう考え方を持っていませんでした。 桁あふれのビットを削除という考え方は 使い勝手が良さそうです。 ビットをギリギリまでしか持たずに足し算したりすると 0に戻っちゃう可能性が考えられるので、 余計にビットを持っていて、変化をみればいいですね!
- usatan2
- ベストアンサー率37% (163/436)
後半だけの回答です。 >話は変わるのですが、 >Nビット×Mビット=N×Mビットになる >とのことです。これも理解できません。 私も理解できません、というかそれ、間違ってます(笑)。 正しくは、 Nビット×Mビット=N+Mビットになる ですよ。 10進数で4桁の5000x5000= 2,5000,000で8桁=(4+4)になりますよね。 決して4*4の16桁にはならないでしょ。
お礼
すいません、補足は削除したいくらいの ダメな質問でした。1000-100=100ですものね。 本当に恥ずかしいです。 10進数での例題は直感的にすごくわかりやすいです。 ありがとうございました!
補足
早速のお返事ありがとうございます。 疑問に思うところがあります。 できればご教授をお願いします。 たとえば、100×100=10000(2進数)となりますが、 この場合は、Nが3、Mが3となるので、3+3=6ですが、 答えは5ビットとなっています。 しかし、111×111=110001(2進数)となるので、 この場合は6ビットになります。 桁上がりがあれば…ということでしょうか?
お礼
素晴らしいとしか言葉が思いつきません! 手計算で検証してみました。 間違いなくその法則に従っています。 もっと深く勉強したくなりました。 似たような例題として、 10(unsinged)*101(singed)を考えてみたい思います。 ここでのポイントは片方しか符合が付いていないことです。 10(符号なし)*101(符号あり)なので、 2+2=4ビットの答えが返ってくることになります。 正しいかどうか、検証しましょう。 10*101=1010です。有効ビットは4ビットなので、そのままにします。 10000-1010=110です。つまり6であると言えます。 1010は10進数で言う-6です。正しいということになります。