• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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になります。

Denkikun
質問者

お礼

素晴らしいとしか言葉が思いつきません! 手計算で検証してみました。 間違いなくその法則に従っています。 もっと深く勉強したくなりました。 似たような例題として、 10(unsinged)*101(singed)を考えてみたい思います。 ここでのポイントは片方しか符合が付いていないことです。 10(符号なし)*101(符号あり)なので、 2+2=4ビットの答えが返ってくることになります。 正しいかどうか、検証しましょう。 10*101=1010です。有効ビットは4ビットなので、そのままにします。 10000-1010=110です。つまり6であると言えます。 1010は10進数で言う-6です。正しいということになります。

その他の回答 (2)

回答No.2

単純なオーバフローの話と思います。 正式の理論は知らないのですが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になるのです。

Denkikun
質問者

お礼

ありがとうございます! 全然そういう考え方を持っていませんでした。 桁あふれのビットを削除という考え方は 使い勝手が良さそうです。 ビットをギリギリまでしか持たずに足し算したりすると 0に戻っちゃう可能性が考えられるので、 余計にビットを持っていて、変化をみればいいですね!

  • usatan2
  • ベストアンサー率37% (163/436)
回答No.1

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

Denkikun
質問者

お礼

すいません、補足は削除したいくらいの ダメな質問でした。1000-100=100ですものね。 本当に恥ずかしいです。 10進数での例題は直感的にすごくわかりやすいです。 ありがとうございました!

Denkikun
質問者

補足

早速のお返事ありがとうございます。 疑問に思うところがあります。 できればご教授をお願いします。 たとえば、100×100=10000(2進数)となりますが、 この場合は、Nが3、Mが3となるので、3+3=6ですが、 答えは5ビットとなっています。 しかし、111×111=110001(2進数)となるので、 この場合は6ビットになります。 桁上がりがあれば…ということでしょうか?

関連するQ&A

  • 2進数の足し算について

    CPUは引き算を行うことができず、2の補数を用いて引き算を足し算として考えれると知りました。 そこで8bitの最上位桁を符号とした7bitの引き算-24+(-8)を計算してみたのですが 24(10進数)→0011000(2進数)→1101000(2の補数) 8(10進数)→0001000(2進数)→1111000(2の補数) 符号 7654321←bit  1 1101000 +1 1111000  X 1100000 となり、1100000の2の補数をとると 0100000(2進)→32(10進数)で答えを求められました。 そこでお聞きしたいのですが、値を足したとき(↑の例だと1100000)が求められたときにどういった条件だと1100000の2の補数をとる必要があるのでしょうか? ↑の例だとXがどの条件のときでしょうか? 質問が長くなってしまいましたがよろしくお願いします。

  • 負の2進数の表示がわかりません

    Q1:負の数(例えば10進数の[-2])を2進数,4ビットで表すには, 1010(MSDの[1]は[-]を表して,後半の3桁は[2])か 1110([0001]の2の補数) どちらが正しいのですか?(学校ではどちらも習いました) またQ2のような計算をするには補数による表示でないとなりませんか?(絶対値に符号をつけるだけだと計算が合いません) Q2:4ビットで表された2進数の計算で    0101-0010=0101+(1110)=10011 となり,答えが5ビットになってしまいます.下4桁で考えると答えが合っている気がします.これで合っていますか?

  • 2の補数を用いた符号付10進数の変換

    次の問題の解き方を教えてください。 次の演算を、符号付2の補数を用いて計算せよ。bit数は符号を含めて6bitとする。あふれが生じたらそれを示せ。 (10)は10進数表記という意味です。 -8(10)-4(10) 15(10)-(-17(10)) 一応自分で解答は作ったのですが、合っている自信が全くないのでご回答お願いします 補足

  • 記数法(n進数)

    ① −(2D)16 を符号付絶対値 8 ビットで表す ② −(146)8 を「負数は 2 の補数で表現する」8 ビットで表す ③ 符号付絶対値 8 ビット (10110101)2 を 10 進数で表す ④「負数は 1 の補数で表現する」 8 ビット (01011001)2 を 8 進数で表す ⑤「負数は 2 の補数で表現する」 8 ビット (10111011)2 を 16 進数で表す ()の後の数字は小文字です。 n進数からm進数への変換と計算はできるようになったのですが、ビットの表現などが分からないので教えて頂きたいです。

  • 2の補数表現2進数が表す10進数は?、

    次の2の補数表現の2進数が表す10進数はいくらか? 1111 1111 1111 1111 1111 1111 1111 1111 という問題があるのですが、 これを解くと、まず、上のビット列は2の補数表現なのだから、これはマイナスですよね?そして、次にビット列を2の補数を求めるやり方でやると元の数がわかりますよね(この辺がいまいち解っていない)? という事は全ビットを0にして、最下位ビットに1を 足せばいいから0000 0000 0000 0000 0000 0000 0000 0000 + 1 =0000 0000 0000 0000 0000 0000 0000 0001 となります。10進数だと 1を表すから答えはー1という事になるのでしょうか?お願いします。

  • 10進数を2進数に

    10進数を2進数に変換する問題なのですが、 まったくもって理解ができません、教えて頂ければ幸いです S(符号)は1ビットで仮数の符号を表す E(指数部)は4ビットで指数を表し負数は2の補数で表現 M(仮数部)は11ビットで仮数の絶対値を表す 基数は2とする 仮数の0,2進数の少数以下第一位が1になるように、正規化された形で表す 小数点はEとMの位置にする 0の表現はー0と+0の二通りがあり特別に指数部と仮数部をすべて0にする 問.10進数の-5.25を2進数で表示しなさい 問.10進数の-0.125を2進数で表示しなさい 答えと解き方を教えて頂ければ幸いです

  • 1の補数の2進数での減算(基本的な事だけど)

    たとえば(13)10=(01101)2, (8)10=(01000)2 という数値を元に考えてみます。 1の補数なので (-13)10=(10010)2 , (-8)10=(10111)2 となります。 ここで8+(-13)と(-8)+13を求めたいのです。 <8+(-13)> ((01000)2 +(10010)2 ((11010)2 bit反転→ (00101)2 = (5)10 よって (11010)2 = (-5)10 <(-8)+13> (((10111)2 +((01101)2 ((100100)2 bit反転→ (011011)2 = ?? どうして答えが5の2進数表現にならないのでしょうか? 解き方が違うのならば、その理由が知りたいのです。

  • 10進数を2進数にする問題について教えてください

    10進数を2進数にする問題について 10進数を2進数に変換について 10進数を2進数に変換する問題なのですが、 まったくもって理解ができません、教えて頂ければ幸いです S(符号)は1ビットで仮数の符号を表す E(指数部)は4ビットで指数を表し負数は2の補数で表現 M(仮数部)は11ビットで仮数の絶対値を表す 基数は2とする 仮数の0,2進数の少数以下第一位が1になるように、正規化された形で表す 小数点はEとMの位置にする 0の表現はー0と+0の二通りがあり特別に指数部と仮数部をすべて0にする 問.10進数の5.25を2進数で表示しなさい 問.10進数の0.125を2進数で表示しなさい 答えと解き方を教えて頂ければ幸いです

  • 2の補数について

    情報処理試験(基本情報)用の考え方という前提でお聞きします。 「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。 この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします) として記述されているものは、もう2の補数になっていると考えていいのでしょうか? それともこれを、今から2の補数に直すのですか? (もし直すのであれば、最上位ビットの符号が変わるのでしょうか?) 違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、 「-A」の2の補数は「A」になるんでしょうか? それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という ことになるのでしょうか? 解りにくくてすみません。

  • 8ビットを2進数で表現すると…

    質問です。 符号付の整数を8ビットの2進数で表現するとき、00110111-11000001の演算結果はどのようになるのでしょうか? 符号ビットは左端にあり、負数は2の補数で表します。