[
板情報
|
カテゴリランキング
]
したらばTOP
■掲示板に戻る■
全部
1-100
最新50
| |
test
45
:
Part159_109
:2012/08/05(日) 12:30:15
#include <stdio.h>
typedef struct { // 2倍長整数を定義する型
int flag; // 0:負、1:正
unsigned int upper; // 上位ワード
unsigned int lower; // 下位ワード
} w_int;
void DivFunc(w_int* pNumA, w_int* pNumB) // 2倍長整数同士の除算 (A÷B)
{
w_int q, r; // q:除算結果 r:余り
int i;
if (pNumB->upper == 0 && pNumB->lower == 0) return; // 分母が0なら終了。
q.upper = q.lower = 0; // 除算結果に0をセットする
r.upper = r.lower = 0; // 余りに0をセットする
for (i = 63; 0 <= i; i--) { // 桁の大きい方から小さいほうに向かって計算する。
r.upper <<= 1; // 余りの上位ワードのみ、除算結果を2倍にする
r.upper |= r.lower >> 31; // 余りの下位ワードの最上位ビットを、上位ワードの最下位ビットにコピー
r.lower <<= 1; // 余りの下位ワードのみ、除算結果を2倍にする
// 分子の、注目するビット位置の値が1なら、余りの下位ワードに1をセットする。(??)
if (32 <= i) { // 上位ワードの計算なら
r.lower |= (pNumA->upper >> (i - 32)) & 1;
} else { // 下位ワードの計算なら
r.lower |= (pNumA->lower >> i) & 1;
}
if (r.upper < pNumB->upper) continue;
if (r.upper == pNumB->upper && r.lower < pNumB->lower) continue;
// ↑余りが分母の値より小さいなら、ループ内で以下の処理は行わない。(除算結果と余りを変更しない)
r.upper -= pNumB->upper; // 余りの上位ワードから、分母の上位ワードを減算する
if (r.lower < pNumB->lower) r.upper--; // 余りの下位ワードが、分母の下位ワードより小さいなら、
// 余りの上位ワードから1を引く。
r.lower -= pNumB->lower; // 余りの下位ワードから、分母の下位ワードを減算する
// 除算結果の、注目するビット位置に1をセットする。
if (32 <= i) { // 上位ワードの計算なら
q.upper |= 1 << (i - 32);
} else { // 下位ワードの計算なら
q.lower |= 1 << i;
}
}
q.flag = !(!pNumA->flag ^ !pNumB->flag); // 除算結果の符号は、AとBどちらか一方が負なら―
r.flag = 1; // 余りの符号は+
*pNumA = q; // Aに除算結果をコピーする
*pNumB = r; // Bに余りをコピーする
}
新着レスの表示
名前:
E-mail
(省略可)
:
※書き込む際の注意事項は
こちら
※画像アップローダーは
こちら
(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板