11/5までセール!人気スマホが1円~

2進数の割り算が分かりません・・・。
授業でいきなり出てきて大変に戸惑っています。
10010➗11(2進数)
の解き方を教えてください。
よろしくお願いします・・・!

このQ&Aに関連する最新のQ&A

A 回答 (5件)

2進数の場合の割り算は引く事が出来るか?をフラグを立てていく感じになります。

「2進数の割り算が分かりません・・・。」の回答画像3
    • good
    • 18
この回答へのお礼

ありがとうございました、すっきりしました!

お礼日時:2016/07/24 01:34

2進数の割り算ができないということは、それよりはるかにむつかしい10進数の割り算はできない。

・・・てなことはないですよね。
 もし10進数ができて、2進数ができないとしたら、10進数の割り算を理解できていないということ。上位の桁から割っていって、割れなければ一つ下の桁に降りて割る・・・の繰り返し。
 100 - 11 = 11 はわかりますか??

  ____
3 ) 18

 __6_
3 ) 18
__18__
   0

  __1__
11 ) 10010
  _11__ 0-1はダメなので10-1=1
    11

  __11__
11 ) 10010
  _11__
    11
  __11__
     0

  __110__
11 ) 10010
  _11__
    11
  __11__
     0

実際には、二進数は0と1しかないので
11)10010__
 __11__  1
    11
 __ 11__  1
    00
  __00_  0
と計算します。
 10進数に直して計算するのは余計な手間がかかるので、そのままのほうが簡単です。
    • good
    • 2
この回答へのお礼

ありがとうございました、すっきりしました!

お礼日時:2016/07/24 01:34

10進数の割り算と同じ。


2進は各桁の重みが2だから10-1は?。
1の位は、0から1が引けないので隣から2借りてきて2-1=1
10の位は、隣へ貸したので1-1=0。
答え:10-1=1

これと同じことを繰り返す。
100-1が10進なら99、2進なら11
「2進数の割り算が分かりません・・・。」の回答画像4
    • good
    • 4
この回答へのお礼

ありがとうございました、すっきりしました!

お礼日時:2016/07/24 01:34

計算過程が重要で無い場合は10進数へ変換してから計算すればよいと思います。


ただ、解き方(考え方)は10進数の時と同じで難しくありません。

↓参考
http://www.geisya.or.jp/~mwm48961/kou3/base2_2.htm

10進数の割り算(確認)
・商は0-9、余り0-9
・上位桁から借りてくる値は10進数なので10、貸した桁からは1をひく。

2進数の割り算
・商は0-1、余り0-1
・上位桁から借りてくる値は2進数なので2、貸した桁からは1をひく。

実際にやってみましょう。
10010の先頭から桁を増やし割れるとこから始めます。
1 ÷ 11 → 割れない…
10 ÷ 11 → 割れない…
100 ÷ 11 → 割れる…仮の商 = 00100
・先頭の桁から順番に借りてくる100→020→012
 2進数に2はありませんが便宜上2とします。(2を借りてくるので)
 10進数の時と同じです。(10を借りてくるので10以上になります)
・012 - 011 = 001 (実際には 01200 - 01100 = 00100)
・残りの00010 + 00100 = 00110
00110 ÷ 00110 → 割りきれる…商 = 00010
一つ上の桁の仮の商 00100 と、この商 00010 を足すと 00110

(図で書かないとわかりにくいですね)

よって、10010 ÷ 11 = 00110 = 110 (= 6)

というように、10進数と同じように順番に計算できます。


念のため、10進数へ変換して計算した場合
10010 = 18
11 = 3
18 ÷ 3 = 6
    • good
    • 2
この回答へのお礼

ありがとうございました、すっきりしました!

お礼日時:2016/07/24 01:34

いろんなやり方がありますが。



まず、
・2進数の引き算はできますか?
・10進数の割り算の筆算はできますか?


10進で 10010 ÷ 11 なら
10 < 11 だから割れない
100≧11 * 9 だから 100の一番下の0の上に9と書いて、線を引いた下に 100-11*9 = 1と書く
11≧11*1だから(以下略)

って感じですよね?

同様に
2進で 10010 ÷ 11 なら
10 < 11 だから割れない
100≧11 * 1 だから 100の一番下の0の上に1と書いて、線を引いた下に 100-11 = 1と書く
(以下略)
と筆算で解くことができます。
    • good
    • 2
この回答へのお礼

ありがとうございました、すっきりしました!

お礼日時:2016/07/24 01:34

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q2進数の除算について

タイトルどおり、2進数の除算についてわからいので質問をします。
(1)割り切る方法と(2)余りを出す回答があるようなのですが、どこのサイトを見てもいまひとつ理解ができなくて困っています。何か具体的な例を挙げていただきたいと思います。

それに加えて、前者の割り切る方法の結果から分かること(法則性)も知りたいのですが、両者について分かる方がいらっしゃれば、どうかお力添えをお願いします。

Aベストアンサー

> また追加で質問なのですが、先の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の補数の定義と合致しているかを確認すればいいと思います。

> また追加で質問なのですが、先の100001÷110=101…11で
> (1)余りを出す
> (2)割り切る という二つの計算方法があるらしく、これは(1)の計算方法なのですが、(2)の割り切るとはいったいどのような方法なのでしょうか?

多分ですが、「小数を使って割りきれ」ということだと思います。

       101
   ―――――――
110)100001
     110
    ――――
      100
        0
      ―――
      1001
       110
     ...続きを読む

Q16進数から10進数への変換

16進数の77が16×14+7だということはわかるのですが、少し複雑になるとわからなくなります。
例えば以下のような場合です。

「16進数で5D2Cは
16の三乗×5+16の二乗×13+16×2+12
とあらわされます。」

なぜ、16の三乗や、16の二乗をする必要があるのでしょうか?

5桁になるとおそらく16の4乗をする必要がありそうですが、
宜しくお願いします。

Aベストアンサー

5桁で16の4乗、というのは正しいです。
この説明は下でされているので省きます。

16進数は数が大きいので、扱いが面倒、と思われるかもしれないので、
簡単な2進数への変換法を書いておきます。

16進数で5D2Cの場合
 1、各桁を2進数に変換する
 ⇒5D2C = 0101 | 1101 | 0010 | 1100
 2、変換したものをそのまま結合する
 ⇒ 0101 | 1101 | 0010 | 1100 ⇒  0101110100101100

 これで、2進数になります。
2のN乗の方が計算が楽だと思いますので、10進数にする場合は
使ってみてはいかがでしょうか?
(8進数の場合も同様にできます)

Q2進数の掛け算ができません

初めまして。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

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

10進数で2*(-3)=-6ですが、これを3bitの2進数で行ないたいと思います。
すると、010*101(2の補数)=01010となります。
-6は10(2の補数)となるはずですが答えが異なります。
符号拡張というものがあるということで、次はそれで行なってみます。
010*1101(符号を拡張した2の補数)=011010となります。
答えが異なります。ますますわけがわかりません。
----------
次に10進数で(-1)*(-1)=1ですが、これを2bitの2進数で行ないた...続きを読む

Aベストアンサー

先ず最初に、間違いの指摘を一つ。
>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になります。

先ず最初に、間違いの指摘を一つ。
>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)ビットになってしまいます。
これは符号ビットの分、有効ビット数が減るためです。

...続きを読む

Q16進小数0.Cを10進数小数に変換したら0.75になりますがわたし自

16進小数0.Cを10進数小数に変換したら0.75になりますがわたし自身良く解りません
詳しくおしえていただけませんでしょうかm(._.)m

Aベストアンサー

10進数で「0.1」と書くと、
小数点より下位の「1」の意味は「10分の1の量が1コ」という意味ですよね。
10分の1の量が1個だと 0.1
10分の1の量が2個だと 0.2
と続けて
10分の1の量が9個だと 0.9
じゃあ
10分の1の量が10個だと?

小数点の右側の場所では表現できないので、左側の場所を使って
1.0
と書きます。
これが10進法です。


16進数で小数点を含む数字の意味を考えると...
16進数「0.C」は、小数点の右側の「C」は「16分の1の量がC個(=12コ)」という意味です。
16分の12は約分できるので、してみると4分の3、10進数の小数で言えば=0.75です。

そういう事です。

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

突然の質問失礼いたします。
現在私は学校で引き戻し法・引き放し法といった除算のアルゴリズムについて学んでいるのですが、そのうちの引き放し法について質問したく投稿しました。

引き放し法について自分で勉強しようと思い、いろいろ調べていたのですが、商と余りを出す引き放し法は見つかっても、小数点以下にわたってまで商を求める引き放し法がまったく見つかりませんでした。
(例えば5÷2=2あまり1と結果を出すのではなく、5÷2=2.5と結果を出す引き放し法のことです。)

少数点以下にわたってまで商を求める引き放し法は商と余りを出す引き放し法で表現できるのでしょうか?
もしよろしければ教えていただけると幸いです。また、参考にすべきインターネットサイト等もあれば教えていただけると助かります。

Aベストアンサー

★30÷8と考えます。
>3÷8などと言った被除数<除数の場合は同じ方法でやってみると
>解がでない気がするのですが・・・。
 ↑
 解けます。
・3÷8 は商が 0 となりますがこの時は 3×10=30 から 8 を割ればよい。
 よって
 (1)3÷8=0
 (2)30÷8=3あまり6
 と計算します。0、3あまり6 と出ますから 0.3 となるわけです。
・あまりの 6 は計算を続けて
 (3)6÷8=0
 (4)60÷8=7あまり4
 となります。ここで 0.3 に 7 を追加して 0.37 となります。
・あまりの 4 は計算を続けて
 (5)4÷8=0
 (6)40÷8=5あまり0
 となります。ここで 0.37 に 5 を追加して 0.375 となります。
・割り切れたので 3÷8=0.375 となります。
 このように『被除数<除数』の場合は10倍して繰り返します。
 それでは宿題として3÷800はどうなるでしょうか?
 出来たら補足などに書き込んでみて下さい。
・以上。

Q10進数の14.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?

10進数の14.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?
10進数の-7.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?
計算方法を教えてください。

Aベストアンサー

14.5を符号と指数と仮数に分けます。
符号は正の数なので符号は0
次に14.5を符号無し2進数に変換すると
1110.1
小数点を左に移動させて1だけ残すと
1110.1=1.1101*2^3
仮数は23ビットで小数点より右側だけなので、足りない分を0でうめて
11010000000000000000000
指数の3を127でバイアスするので
3+127=130
これを2進数に直すと
10000010
全て合わせると、
01000001011010000000000000000000
で、32ビットの2進数に変換できました。
同じように、-7.5を変換すると、
符号は負の数なので1
-7.5を符号無し2進数に変換すると、
 111.1
=1.111*2^2
なので、仮数は
11100000000000000000000
指数の2を127でバイアスすると
2+127=129
これを2進数に直すと
10000001
全て合わせると
11000000111100000000000000000000
になります。
64ビットの場合は、指数のバイアスを127から1023にし、仮数の23ビットを52ビットまで増やせばOKです。

14.5を符号と指数と仮数に分けます。
符号は正の数なので符号は0
次に14.5を符号無し2進数に変換すると
1110.1
小数点を左に移動させて1だけ残すと
1110.1=1.1101*2^3
仮数は23ビットで小数点より右側だけなので、足りない分を0でうめて
11010000000000000000000
指数の3を127でバイアスするので
3+127=130
これを2進数に直すと
10000010
全て合わせると、
01000001011010000000000000000000
で、32ビットの2進数に変換できました。
同じように、-7.5を変換すると、
符号は負の数なので1
-7.5を...続きを読む

QCRCのアルゴリズムって、どんな計算するんですか?

こんにちはお世話になります。
私はネットワークに興味があるオジサンです。
先日、データリンク層のプロトコル群を勉強していたとき、誤り訂正でCRCが出てきました。誤り訂正ではパリティーチェックやチェックサム等は聞き覚えがありましたが、CRCは始めて見たので興味を持ち少し調べてみようと思いました。
それが間違いの元でした。
インターネットでCRCの構造を詳しく解説するサイトが少なく、その解説は難しすぎて手におえません。
数学にはめっぽう弱い私には、多項式同士の加減乗除算などは頭痛の肥やしにしかなりません。
今ではCRCが気になって勉強に集中できない状態です。
そこで、表題にもあるCRCのアルゴリズムを、何方か分かり易く教えてくださいませんか。もしくは、CRCのアルゴリズムを簡単に解説している書籍をご存知でしたら教えてください。
カテゴリー(本来は数学系?)が違うかもしれませんが、何卒よろしくお願い申し上げます。

Aベストアンサー

偶数パリティについておさらいすると、1 となるビットの個数が偶
数になるように、検査ビットを定めるというものですよね?で、検
査側では、1 の個数を数えて奇数だとエラーと判断するわけです。

実は、この偶数パリティというチェックのしかたは、CRC の一種な
んです。CRC では、ある特定の生成多項式を使いますが、CRC の生
成多項式として x + 1 を使ったものが偶数パリティです。

多項式の加減乗除で頭痛ということなら、ちょっと説明が厳しいの
ですが、2進数の加減乗除はできるでしょうか?これがだいじょう
ぶなら、1+1=0(つまり、0-1=1)という世界での2進数の加減乗除
を考えるということでも同じです。

この場合、x+1 という多項式は、11 と考えます。(xのi乗の係数
を第iビットの値とみなす)

例えば、10110 というデータに対して、11 という生成多項式で
CRC の検査ビットを求めるには、生成多項式の桁数-1=1ビット
分データを左にシフトして、101100 を得ます。この値を、上の特
殊な2進数の世界で、生成多項式の 11 で割ります。そうすると、
商として 11011、余りとして 1 が得られます。試しにやってみて
ください。この余りを、101100 から引いて(特殊な2進数の世界で
は足すのと同じ)やると、101101 が出ます。これが送るべき符号
ということになります。実際、1の個数は偶数ですので、付け足し
たビットが偶数パリティとなっていることがわかります。

余りの分を引いたわけですから、このデータは 11 で割り切れるは
ずですので、検査側では 11 で割って、余りが 0 であることを確
認すればいいわけです。

この生成多項式の選び方で、検査の能力が変わってきます。やみく
もに選んだら、検査能力がまったくなくなります。通常の CRC は、
それを考慮してうまく多項式を作ってあるというだけのことです。

なぜ 11 なら偶数パリティと同じなのかとか、生成多項式をどう選
べばいいかとかについては、符号理論の勉強が必要です。前者はそ
れほど難しくはないですが。

偶数パリティについておさらいすると、1 となるビットの個数が偶
数になるように、検査ビットを定めるというものですよね?で、検
査側では、1 の個数を数えて奇数だとエラーと判断するわけです。

実は、この偶数パリティというチェックのしかたは、CRC の一種な
んです。CRC では、ある特定の生成多項式を使いますが、CRC の生
成多項式として x + 1 を使ったものが偶数パリティです。

多項式の加減乗除で頭痛ということなら、ちょっと説明が厳しいの
ですが、2進数の加減乗除はできるでしょうか?こ...続きを読む

Q10進法⇒2進法には何故2で割るか

タイトルどおりですが何故なんでしょうか?
学校ではただ2で割る程度にしか教わっておりません。
2進法では0と1の2種類だから2で割るのかなとか
ぼんやり思っておりますが
きっと正しくはないだろうと思いましたので。
どなたかお願いします。

Aベストアンサー

>2進法では0と1の2種類だから2で割るのかなとか
>ぼんやり思っておりますが
その通りです.3進法では3で16進法では16で割ればいいのです!!
では,そのぼんやりをこれから明確にしましょう.
ゆっくり読んで行って下さい.
例えば,10進法による表記で
77=7×10+7
は2進法による表記では
1001101
です.
これは

1×2^6+0×2^5+0×2^4+1×2^3+1×2^2+0×2^1+1

であるので,これを2で割ると

商1×2^5+0×2^4+0×2^3+1×2^2+1×2^1+0×1
余り1

さらにこの商を2で割ると

商1×2^4+0×2^3+0×2^2+1×2^1+1×1
余り0

以下同様にして

商1×2^3+0×2^2+0×2+1×1
余り1

商1×2^2+0×2^1+0×1
余り1

商1×2^1+0×1
余り0

商1×1
余り0

商0
余り1

下から余りを並べて行けば77の2進数表示1001101が得られます.
どんな10進数でも2で割った余りを下から並べて行けば2進数表示が得られるのです.

上の商の所をしっかり見て考えて下さい.
1001101を一般的にabcdefgと表すと
一番右の部分gは2より小さい数0か1なので,
2で割ると余りはgが出てきます.
さらにその商abcdefの一番右の部分も2より小さい数0か1なので2で割るとfが出てきます.
これを繰り返していくと
余りは下からabcdefgの順番に出てくるのでそれを並べれば2進数表示となるのです.
ちょっと説明がわかりにくかったかもしれませんが,これをヒントにじっくり考えれば分かるはずです.

>2進法では0と1の2種類だから2で割るのかなとか
>ぼんやり思っておりますが
その通りです.3進法では3で16進法では16で割ればいいのです!!
では,そのぼんやりをこれから明確にしましょう.
ゆっくり読んで行って下さい.
例えば,10進法による表記で
77=7×10+7
は2進法による表記では
1001101
です.
これは

1×2^6+0×2^5+0×2^4+1×2^3+1×2^2+0×2^1+1

であるので,これを2で割ると

商1×2^5+0×2^4+0×2^3+1×2^2+1×2^1+0×1
余り1

さらにこの商を2で割ると

商1×2^4+0×2^3+...続きを読む

Q除算を使わずに10で割りたい。

加算、減算、シフト、論理演算、ループ、等を使って
除算を使わずに10で割る方法は無いものでしょうか?
また、近似値を求めてから誤差を修正する方法でも構いません。

ただし、ループで10を引き続けてカウントする方法は除外させてください。

言語はCでお願いします。

Aベストアンサー

ANo.15 は「引き戻し法」ですね。いわゆる普通の「割り算の筆算」をそのまま2進数ベースで実装したものです。
(10進の割り算の場合は、各桁で「1倍~9倍のどこまで引けるか」を計算しますが、2進数なので、「引ける(その桁は1)か引けない(その桁は0)か」の2択の判定になります。

それをもうちょっと進めた(計算量を減らした)方法に「引き放し法」というのもあります。「引けるかどうか」チェックしてから「引く」のは二度手間なので、「引いてしまってから、結果によって次の処理を変える(負になったら、次のステップでは足すようにする)」というものです。

でも、この手の処理は「CPUの内部でハードウェアで実装されている」機能ですから、それをソフトウェアで実装するのは遅いだけでメリットはありません。
多倍長演算が例に挙げられてますけど、多倍長の2進数で実装する場合でも、
個々の演算は通常の加減乗除の組合せで実装するのが普通です。
例えば、32bitCPUで256bitの数値演算をしたいのであれば、
「4294967296進数で8桁の数値」を扱うようにすればいいんです。

簡単な例ですが、以下、64bitの数値を16bit×4桁と考えて10で割るコードです。除数の方も多倍長になるとやることは格段に複雑になりますが、演算の基本方針は同じです。


#include <stdio.h>
int main(int argc, char *argv[])
{
union {
unsigned long long ulonglong;
unsigned short ushort[4];
} x, y;
unsigned int div, mod;

x.ulonglong = 9876543210LL;
printf("%lld = %d * (1<<48) + %d * (1<<32) + %d * (1<<16) + %d\n", x.ulonglong, x.ushort[3], x.ushort[2], x.ushort[1], x.ushort[0]);
/* x86 CPUは Little Endian なので、ushort[3]が上位でushort[0]が下位 */

div = x.ushort[3] / 10;
mod = x.ushort[3] % 10;
y.ushort[3] = div;

div = (mod * 65536 + x.ushort[2]) / 10;
mod = (mod * 65536 + x.ushort[2]) % 10;
y.ushort[2] = div;

div = (mod * 65536 + x.ushort[1]) / 10;
mod = (mod * 65536 + x.ushort[1]) % 10;
y.ushort[1] = div;

div = (mod * 65536 + x.ushort[0]) / 10;
mod = (mod * 65536 + x.ushort[0]) % 10;
y.ushort[0] = div;

printf("%lld / 10 = %lld mod %d\n", x.ulonglong, y.ulonglong, mod);

}

ANo.15 は「引き戻し法」ですね。いわゆる普通の「割り算の筆算」をそのまま2進数ベースで実装したものです。
(10進の割り算の場合は、各桁で「1倍~9倍のどこまで引けるか」を計算しますが、2進数なので、「引ける(その桁は1)か引けない(その桁は0)か」の2択の判定になります。

それをもうちょっと進めた(計算量を減らした)方法に「引き放し法」というのもあります。「引けるかどうか」チェックしてから「引く」のは二度手間なので、「引いてしまってから、結果によって次の処理を変える(負になったら、次の...続きを読む

Qべき乗

べき乗とは一体なんですか?
ウィキを見ても理解できませんでした。
2の2乗は2×2ですが、
2のマイナス2乗は一体どのような式なのですか?

Aベストアンサー

算数の延長線上だけの概念だけだといまいち理解出来ないですよね。
べき乗って要は指数なんですけど、
そういう難しい話を出来るだけ捨てて、算数の世界で説明出来る位まで掘り下げて説明します。

例えば 10の2乗は100、10の3乗は1000となります。
これを数字の動きに目を合わせてもう一度、書いてみます。
00010.00000 ←これを2乗すると↓
00100.00000 //10という値が左に1つずれた結果が答え

00010.00000 ←これを3乗すると↓
01000.00000 //10という値が左に2つずれた結果が答え

こういう風に表す事が出来ます。
じゃあ、10のマイナス2乗ってなった場合はどうなるのかというと、
00010.00000 ←これを-2乗する↓
00000.01000 //10という値が右に3つずれた結果が答え

という答えになります。
1を基準点として、右や左にいくつずれるか。
これがべき乗なのです。


で、2のべき乗を考えた時は、
全部2進数で考える必要があります。
00010.00000 ←2進数で表した数値の2
00100.00000 ←2乗した結果。数値で言うと4
00010.01000 //-2乗した結果。数値で言うと0.25


これで何となく分かっていただけたでしょうか?
ちなみに37のx乗を計算するみたいな時があったとしたら、
それは37進数で考えるという計算が必要になるのです。

算数の延長線上だけの概念だけだといまいち理解出来ないですよね。
べき乗って要は指数なんですけど、
そういう難しい話を出来るだけ捨てて、算数の世界で説明出来る位まで掘り下げて説明します。

例えば 10の2乗は100、10の3乗は1000となります。
これを数字の動きに目を合わせてもう一度、書いてみます。
00010.00000 ←これを2乗すると↓
00100.00000 //10という値が左に1つずれた結果が答え

00010.00000 ←これを3乗すると↓
01000.00000 //10という値が左に2つずれた結果が答え

こういう風...続きを読む


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング