- ベストアンサー
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
- Denkikun
- お礼率100% (3/3)
- 数学・算数
- 回答数3
- ありがとう数4
- みんなの回答 (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ビットになります。 桁上がりがあれば…ということでしょうか?
関連する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)) 一応自分で解答は作ったのですが、合っている自信が全くないのでご回答お願いします 補足
- ベストアンサー
- 数学・算数
- 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という事になるのでしょうか?お願いします。
- ベストアンサー
- その他(インターネット・Webサービス)
- 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進数で表示しなさい 答えと解き方を教えて頂ければ幸いです
- 締切済み
- C・C++・C#
- 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進数で表示しなさい 答えと解き方を教えて頂ければ幸いです
- 締切済み
- C・C++・C#
- 2の補数について
情報処理試験(基本情報)用の考え方という前提でお聞きします。 「負数を2の補数形式で表現する2進数の計算で・・・・」という問題がよくあります。 この問題文の中で「10101」などの数(これは5ビットの符号付2進数とします) として記述されているものは、もう2の補数になっていると考えていいのでしょうか? それともこれを、今から2の補数に直すのですか? (もし直すのであれば、最上位ビットの符号が変わるのでしょうか?) 違う言い方をしてみますと「A」の2の補数が「-A」だとしたら、 「-A」の2の補数は「A」になるんでしょうか? それとも「そんな表現はない。-Aの時点ですでに2の補数だ」という ことになるのでしょうか? 解りにくくてすみません。
- ベストアンサー
- その他(プログラミング・開発)
- 8ビットを2進数で表現すると…
質問です。 符号付の整数を8ビットの2進数で表現するとき、00110111-11000001の演算結果はどのようになるのでしょうか? 符号ビットは左端にあり、負数は2の補数で表します。
- 締切済み
- その他([技術者向] コンピューター)
お礼
素晴らしいとしか言葉が思いつきません! 手計算で検証してみました。 間違いなくその法則に従っています。 もっと深く勉強したくなりました。 似たような例題として、 10(unsinged)*101(singed)を考えてみたい思います。 ここでのポイントは片方しか符合が付いていないことです。 10(符号なし)*101(符号あり)なので、 2+2=4ビットの答えが返ってくることになります。 正しいかどうか、検証しましょう。 10*101=1010です。有効ビットは4ビットなので、そのままにします。 10000-1010=110です。つまり6であると言えます。 1010は10進数で言う-6です。正しいということになります。