• ベストアンサー

2進数の除算について

タイトルどおり、2進数の除算についてわからいので質問をします。 (1)割り切る方法と(2)余りを出す回答があるようなのですが、どこのサイトを見てもいまひとつ理解ができなくて困っています。何か具体的な例を挙げていただきたいと思います。 それに加えて、前者の割り切る方法の結果から分かること(法則性)も知りたいのですが、両者について分かる方がいらっしゃれば、どうかお力添えをお願いします。

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

  • ベストアンサー
  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.4

> また追加で質問なのですが、先の100001÷110=101…11で > (1)余りを出す > (2)割り切る という二つの計算方法があるらしく、これは(1)の計算方法なのですが、(2)の割り切るとはいったいどのような方法なのでしょうか? 多分ですが、「小数を使って割りきれ」ということだと思います。        101    ――――――― 110)100001      110     ――――       100         0       ―――       1001        110       ――――         11 ↓(1/2の位に進む)        101    ――――――――― 110)100001.0      110     ――――       100         0       ―――       1001        110       ――――         11 0 ↓(商の1/2の位の数は1)        101.1    ――――――――― 110)100001.0      110     ――――       100         0       ―――       1001        110       ――――         11 0         11 0         ――――            0 商は101.1 > また、その割り切った結果から何が分かるのでしょうか? 分かりません。 10進数ではどんな有限小数も、(2^n)(5^m)で割りきれます(n, mは0以上の整数)。 逆に(2^n)(5^m)で表せない数(例えば6)で割ると、割り切れない場合があります。 対して2進数では、どんな有限小数も(2^n)で割りきれます(nは0以上の整数)。 逆に(2^n)で表せない数(例えば10)で割ると、割り切れない場合があります。 そういったわり算に関する話がありますが、 先ほどのわり算1個だけからそんな結論を得るのは不可能だと思います。 > (1)2進数の補数計算の方法に関して4つまとめる (1)の「4つ」とは何が4つなのでしょうか? 「たし算、ひき算、かけ算、わり算の4つの計算方法についてまとめなさい」ということでしょうか? だとしたら、それぞれの計算方法について説明すれば良いと思います。 小学校の算数の教科書には、10進数のたし算やひき算や かけ算やわり算のやり方が書いてありますよね。 あれを2進数版に書き直すような感じでいいのではないでしょうか? まず1桁のたし算から始めて、その後繰り上がりの概念を利用して2桁以上のたし算を説明し、 次にたし算の筆算のやり方を……といった感じでやれば良いと思います。 ここの環境だと筆算の繰り上がりや繰り下がり等が表記できないので、 申し訳ないですが、計算方法のまとめを書くのは無理です。 > (2)2進数の1の補数が,ビット毎の0・1反転で得られることを証明 1の補数の定義を知らないので、大したアドバイスはできません。 とりあえず、思いついたことを書いておきます。 1桁の2進数aをビット反転させると、(1 - a)になります。 a = 0の時、(1 - a) = 1 a = 1の時、(1 - a) = 0 次に2桁以上の2進数のビット反転を考えます。 ある2進数Xのn桁目の数をx_nと表現します(x_n = 0, 1)。 この時、Xをビット反転させた数のn桁目の数は(1 - x_n)で表せます。 これは先ほどの、「1桁の2進数aをビット反転させると(1 - a)となる」という話と同じです。 後はこの「n桁目の数がx_nの2進数」と「n桁目の数が(1 - x_n)の2進数(ビット反転させた2進数)」を比較し、 1の補数の定義と合致しているかを確認すればいいと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.3

やり方は、10進数と同じです。 筆算を書いてみますが、もしレイアウトが崩れていたら コピー&ペーストしてメモ帳などに張り付けてみて下さい。 < 10進数の場合 > 1254÷5 ↓(筆算にします)  ――――― 5)1254 ↓(商の百の位は2。5×2を計算)    2  ――――― 5)1254   10 ↓(12-10を計算)    2  ――――― 5)1254   10   ――    2 ↓(十の位に進む)    2  ――――― 5)1254   10   ―――    25 ↓(最終的に)    250  ――――― 5)1254   10   ―――    25    25    ―――      4      0      ―      4 商250、余り4 < 2進数の場合 > 100001÷110 ↓(筆算にします)    ――――――― 110)100001 ↓(商の四の位は1。110×1を計算)        1    ――――――― 110)100001      110 ↓(1000-110を計算)        1    ――――――― 110)100001      110     ――――       10 ↓(二の位に進む)        1    ――――――― 110)100001      110     ――――       100 ↓(商の二の位は0。110×0を計算し、100 - 110×0。計算後、一の位に進む)        10    ――――――― 110)100001      110     ――――       100         0       ―――       1001 ↓(商の一の位は1。110×1を計算)        101    ――――――― 110)100001      110     ――――       100         0       ―――       1001        110 ↓(1001-110を計算)        101    ――――――― 110)100001      110     ――――       100         0       ―――       1001        110       ――――         11 商101、余り11 2進数の割り算の筆算でネックになるのは、『2進数のかけ算、ひき算が出てくること』です。 特に今回は引き算がネックです。1000-110を2進数のまま計算できますか? まずは2進数のまま、たし算の筆算とひき算の筆算ができるようになった方がいいでしょう。 でなければ、かけ算とわり算の筆算もできません。 たし算ひき算の筆算のやり方は、10進法と同じです(かけ算、割り算もそうですが)。 1 + 1 = 10という繰り上がりや、10 - 1 = 1のような繰り下がりに慣れれば楽に計算できます。 < 足し算の例 >  11 +11 ―――   0(二の位に1繰り上がり) ↓  11 +11 ―――  10(和の二の位は1 + 1 + 1 = 11。なので四の位に1繰り上がり) ↓  11 +11 ――― 110

foxray
質問者

補足

私理解できなかったのは、上記の2進数の割り算の筆算の過程でした。2進数の引き算を使用し、途中過程まではわかったのですが、どうしても数字がずれて計算があわなかったのです・・・。ただ、回答をみてよくどこが間違えていたのか理解できました。 また追加で質問なのですが、先の100001÷110=101…11で (1)余りを出す (2)割り切る という二つの計算方法があるらしく、これは(1)の計算方法なのですが、(2)の割り切るとはいったいどのような方法なのでしょうか? また、その割り切った結果から何が分かるのでしょうか? もしよろしければ、2進数の補数の計算方法のまとめや、下記の証明もお答えくださると助かります。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

う~ん.... 「100001÷110 がよく分からない」と書かれてますけど, 「どこが」よく分からないんでしょうか? 「2進数の除算」って「10進数の除算」と特段違うことはない (もちろん基数が違うから完全に同じではないけど) ので....

foxray
質問者

補足

えっと、33÷6=5余り3の2進数なので、回答が101あまり11だというは分かるのですが、その過程が分からないのです・・・。筆算でとく過程と言ったらいいのでしょうか。 また質問で+αなのですが (1)2進数の補数計算の方法に関して4つまとめる (2)2進数の1の補数が,ビット毎の0・1反転で得られることを証明 というのも、もし分かるのでしたら、解説をお願いしたいです。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

10進数の除算ならわかりますか?

foxray
質問者

補足

例えば、10進数33÷6なら通常の計算=5余り3という理解でいいんですよね?。 今回はその2進数で、上記だと100001÷110がよく分からないのです・・・。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • [2進数 シフト演算 除算について]

    [2進数 シフト演算 除算について] シフト演算について勉強中です。ご協力お願い出来たら幸いです。 乗算について例えば『1010』(符号ビットを考えず)を2倍 4倍 8倍(2のn乗)した場合 ビットを2倍であれば1つ、4倍であれば2つ・・・左に シフトすれば良いというのは理解しました。 また3倍 5倍などのケースも、 3倍であれば1ケタ左にシフトした数+1010で求まる事も理解しました。 問題は除算です。他の質問を探ってみたのですが、考え方は一緒という回答で・・・詰まっています 除算は右シフトとの事ですが 先ほどの例である『1010』(10)ですがこれを1/2、つまり2で割ると 1つ右にシフトし1010→0101 となり 1010を1/4する場合右に2ビットシフトし 1010→0010.10 となり理解は出来ます。 しかし1/3 、1/5といった場合の計算の仕方が分かりません。 余りを出さないという考えで(近似値になると思いますが) 解き方をご教授願えたらと思います。

  • 0除算を判定したい

    0除算とは例えば10を0で割ったら結果が無限大になるように、ある数を0で割った時に起こる現象です。 しばしばこの0除算に悩まされるので、ある式を代入したらそれが0除算であるかどうかを判定できたらと思いました。 そこで下のような関数を作れたらと思っているのですが、 ある式を見てその結果が0除算であるかを判定する方法はありますでしょうか? int isDivide0( float val ) {   if ( val == 0除算 )     return 1;   else     return 0; } int main() {   isDivide0( 10 / 0 ); } 尚、開発環境はVisual Studio2005です。

  • 引き放し法による除算アルゴリズムについて

    突然の質問失礼いたします。 現在私は学校で引き戻し法・引き放し法といった除算のアルゴリズムについて学んでいるのですが、そのうちの引き放し法について質問したく投稿しました。 引き放し法について自分で勉強しようと思い、いろいろ調べていたのですが、商と余りを出す引き放し法は見つかっても、小数点以下にわたってまで商を求める引き放し法がまったく見つかりませんでした。 (例えば5÷2=2あまり1と結果を出すのではなく、5÷2=2.5と結果を出す引き放し法のことです。) 少数点以下にわたってまで商を求める引き放し法は商と余りを出す引き放し法で表現できるのでしょうか? もしよろしければ教えていただけると幸いです。また、参考にすべきインターネットサイト等もあれば教えていただけると助かります。

  • 2進数の1の数を数える問題

     次の問題に対して、以下のソースを考案し、実行したところ、以下のようになりました。 【問】 ◆◆◆◆◆  与えられた10進数の整数Nを2進数に変換したときの1の個数を答えよ。  整数の10進数を2進数に変換するには、変換したい10進数を商が0になるまで2で割り続け、求めた余りの部分を逆順に並べる。 例) 13が入力として与えられた場合、以下のように2で割り続け2進数を求める。 13 / 2 = 6 ・・・余り 1 6 / 2 = 3 ・・・余り 0 3 / 2 = 1 ・・・余り 1 1 / 2 = 0 ・・・余り 1  求められたそれぞれの余りを逆順に並べたものが2進数への変換結果となる。  よって入力が13ならば2進数への変換結果は 1101 になり、1は3個あるので出力は3になる。 [入力例1] 13 [出力例1] 3 [入力例2] 45 [出力例2] 4 ◆◆◆◆◆ (自分の解答、□はタブ) ◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ int main(void) { □int n, bit, s; □scanf("%d", &n); □ □bit = n % 2; □n /= 2; □s = 0; □while(n) { □□if (bit) □□□s++; □bit = n % 2; □n /= 2; □} □printf("%d", s); □return EXIT_SUCCESS; } ◆◆◆◆◆ (実行結果1) ◆◆◆◆◆ [入力] 13 [出力] 2 ◆◆◆◆◆ (実行結果2) ◆◆◆◆◆ [入力] 45 [出力] 3 ◆◆◆◆◆ となり、正解となりません。  自分の考えとしては、入力された数値を変数nに収め、これをどんどん2で割っていき、そのときの余り(0か1)を変数bitに収めていき、nが0になるまで処理を繰り返し、bitが0でないとき、変数s(初期値0)に1ずつ加算していき、最後にsを出力する、という方針です。  初期値の設定辺りが間違っているのだと思いますが、これ以上いくら考えても正解が得られません。どこがどう間違っているのでしょうか。どなたかご教授頂きたく、お願い致します。

  • C言語の課題で困っています。その1.四則演算

    二つの整数値を読み込んで、前者を後者で割り、その結果の商と余りを表示するプログラムを作成。 実行例にあるよう、ゼロで割るような場合への対処も考慮する。 実行例1: 整数の除算を行います。整数を入力してください。 整数A:13 整数B:5 13 ÷ 5 = 2 あまり 3 実行例2: 整数の除算を行います。整数を入力してください。 整数A:10 整数B:0 0でわることはできません! (注)プログラム実行時にキーボードからどんな整数を入力してもいいように作成すること。 という課題に取り組んでいますが、途中までしか記述できません。 どなたか助けてください。 下記が途中までの記述です。 /*二つの整数値を読み込んで、前者を後者で割り、その結果の商と余りを表示*/ #include <stdio.h> int main(void) { int na, nb; printf("shimasaki kazunori \n"); puts("整数の除算を行います。整数を入力してください。: \n"); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("na ÷ nb = %d あまり %d \n", na / nb, nb, na % nb); return(0); }

  • 時間項目を60進数から10進数へ変換する方法

    初めて質問させて頂きます。 現在テーブルの中に「時間の長さ」を管理している項目があります。 具体的には ・1時間30分ですと「130」 ・10時間15分ですと「1015」 のように管理してあります。 この項目を10進数で表現し、更に時間を単位として算出したい状態です。 例 1時間30分ですと「130」なので「1.5(h)」として算出したいのです。 このように変換できるファンクションを作成しようとしているのですが、なかなかうまくいきません。 今試している方法としては "時間"と"分"に分けて考えて、"分"は60で除算しようとしています。 それを足しこむ事で、上の例ですと「1 + 0.5 = 0.5」と算出しているのですが "分"がうまく割り切れない場合の端数処理や例外の場合を考えると どのようにファンクションを作ればよいか分からなくなってきました。 どなたか良い例を教えて頂けませんでしょうか。 よろしくおねがいします。

  • 四則演算についてです

    四則演算の除算法についてですが {23/6}を2進数で求めたいです。 但し、被除数は6ビット、除数は4ビットという条件付き。 23=(0 10111)2 6=(0 110)2 2の補数を用いて-6=(1 010)2 減算結果が正の場合、商として1をたて 減算結果が負の場合、商として0を立てるのですが 010111 +)1010    商 --------- 111111 …0 +) 1010 --------- 1010011 …0 +) 1010 --------- 1101 …0 +) 1010 --------- 10111 となってしまい商と余りがうまく出ません! 間違ってるところ教えてください!

  • 10進数と2進数 上手な説明の仕方

    10進数と2進数 上手な説明の仕方 教師です。 生徒に↑の違いを説明したいのですが、 イマイチ話が下手くそで理解してもらえません。。。 自分としては理解してるのですが、 教えるとなるとどういうふうに説明すればいいのか もしよければ例えば教科書の例題通りに「125」(10進数)を例にして、 解説していただけませんか? お願いします。

  • 2進数・10進数・16進数

    過去ログみてもよく分からなかったので質問します。 題名の通り 2進数→10進数(逆に10進数→2進数)などといったような変換ができません。1学期に授業でやったのですが授業プリントなくしてしまい・・・ 例えば(教科書見ながら書いてます) (1)2進数「0010」がどうして10進数で「2」なんですか(計算方法教えてください?? ↑2進数「0010」を色々計算して「2」を出したような気がします。 (2)16進数から2進数への変換も計算方法を教えてください。 例:16進数「C」がなぜ2進数「1100」なんですか?

  • 兄弟素数

    「数を考える」をよんでいます。岩波ジュニア。 その154p~155pのところですが、 pを素数とします。 5<p(pは5より大きい)のとき、pを先頭にする7人兄弟素数は存在しないことを証明するときに、 兄弟素数を3×5=15で割った余りに注目するのはどうしてなのか、分かりやすく説明できるひとはいますか。 確かに、この方法だとうまくいくことは理解できたのですが。引っかかっています。 わかりやすく説明するのがむずかしければ、ヒントとか類似問題などでも構いません。 宜しくお願いします。