したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

test

45Part159_109:2012/08/05(日) 12:30:15
#include <stdio.h>

typedef struct {&nbsp;&nbsp;// 2倍長整数を定義する型
&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;flag;&nbsp;&nbsp;// 0:負、1:正
&nbsp;&nbsp;unsigned int&nbsp;&nbsp;upper;&nbsp;&nbsp;// 上位ワード
&nbsp;&nbsp;unsigned int&nbsp;&nbsp;lower;&nbsp;&nbsp;// 下位ワード
} w_int;

void DivFunc(w_int* pNumA, w_int* pNumB)&nbsp;&nbsp;// 2倍長整数同士の除算 (A÷B)
{
&nbsp;&nbsp;w_int&nbsp;&nbsp;q, r;&nbsp;&nbsp;// q:除算結果 r:余り
&nbsp;&nbsp;int&nbsp;&nbsp;i;

&nbsp;&nbsp;if (pNumB->upper == 0 && pNumB->lower == 0) return;&nbsp;&nbsp;// 分母が0なら終了。
&nbsp;&nbsp;q.upper = q.lower = 0;&nbsp;&nbsp;// 除算結果に0をセットする
&nbsp;&nbsp;r.upper = r.lower = 0;&nbsp;&nbsp;// 余りに0をセットする
&nbsp;&nbsp;for (i = 63; 0 <= i; i--) {&nbsp;&nbsp;// 桁の大きい方から小さいほうに向かって計算する。
&nbsp;&nbsp;&nbsp;&nbsp;r.upper <<= 1;&nbsp;&nbsp;// 余りの上位ワードのみ、除算結果を2倍にする
&nbsp;&nbsp;&nbsp;&nbsp;r.upper |= r.lower >> 31;&nbsp;&nbsp;// 余りの下位ワードの最上位ビットを、上位ワードの最下位ビットにコピー
&nbsp;&nbsp;&nbsp;&nbsp;r.lower <<= 1;&nbsp;&nbsp;// 余りの下位ワードのみ、除算結果を2倍にする
&nbsp;&nbsp;&nbsp;&nbsp;// 分子の、注目するビット位置の値が1なら、余りの下位ワードに1をセットする。(??)
&nbsp;&nbsp;&nbsp;&nbsp;if (32 <= i) {&nbsp;&nbsp;// 上位ワードの計算なら
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.lower |= (pNumA->upper >> (i - 32)) & 1;
&nbsp;&nbsp;&nbsp;&nbsp;} else {&nbsp;&nbsp;&nbsp;&nbsp;// 下位ワードの計算なら
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.lower |= (pNumA->lower >> i) & 1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if (r.upper < pNumB->upper) continue;
&nbsp;&nbsp;&nbsp;&nbsp;if (r.upper == pNumB->upper && r.lower < pNumB->lower) continue;
&nbsp;&nbsp;&nbsp;&nbsp;// ↑余りが分母の値より小さいなら、ループ内で以下の処理は行わない。(除算結果と余りを変更しない)
&nbsp;&nbsp;&nbsp;&nbsp;r.upper -= pNumB->upper;&nbsp;&nbsp;// 余りの上位ワードから、分母の上位ワードを減算する
&nbsp;&nbsp;&nbsp;&nbsp;if (r.lower < pNumB->lower) r.upper--;&nbsp;&nbsp;// 余りの下位ワードが、分母の下位ワードより小さいなら、
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 余りの上位ワードから1を引く。
&nbsp;&nbsp;&nbsp;&nbsp;r.lower -= pNumB->lower;&nbsp;&nbsp;// 余りの下位ワードから、分母の下位ワードを減算する
&nbsp;&nbsp;&nbsp;&nbsp;// 除算結果の、注目するビット位置に1をセットする。
&nbsp;&nbsp;&nbsp;&nbsp;if (32 <= i) {&nbsp;&nbsp;// 上位ワードの計算なら
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.upper |= 1 << (i - 32);
&nbsp;&nbsp;&nbsp;&nbsp;} else {&nbsp;&nbsp;&nbsp;&nbsp;// 下位ワードの計算なら
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.lower |= 1 << i;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;q.flag = !(!pNumA->flag ^ !pNumB->flag);&nbsp;&nbsp;// 除算結果の符号は、AとBどちらか一方が負なら―
&nbsp;&nbsp;r.flag = 1;&nbsp;&nbsp;&nbsp;&nbsp;// 余りの符号は+
&nbsp;&nbsp;*pNumA = q;&nbsp;&nbsp;&nbsp;&nbsp;// Aに除算結果をコピーする
&nbsp;&nbsp;*pNumB = r;&nbsp;&nbsp;&nbsp;&nbsp;// Bに余りをコピーする
}


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板