多倍長整数の演算で悩んでいます。
longまでしかない32bitマイコンでC言語で多倍長整数の演算を行いたいと思っています。
long longが使える元々実装されている以下のソースを、long longが実装されていない処理系に移植する必要があります。
C
1#define HUNDREDKETA 9 2const QWORD hundredk[HUNDREDKETA] = { 1L, // 0: 1の位 3 100L, // 1: 100の位 4 10000L, // 2: 5 1000000L, // 3: 6 100000000L, // 4: 7 10000000000L, // 5: 8 1000000000000L, // 6: 9 100000000000000L, // 7: 10 10000000000000000L }; // 8: 11 12static void HundredStrToDWord( BYTE *outd, int outlen, BYTE *ind, int length ) 13{ 14 int i, k; 15 QWORD wdt = 0; 16 17 // ind[4]:100000000Lの位,ind[5]:1000000Lの位,ind[6]:10000の位,ind[7]:100の位,ind[8]:1の位 18 for( i = 0,k=length-1; i < length; i++,k-- ) 19 wdt += (DWORD)ind[i] * hundredk[k]; 20 21 for( i = outlen-1; i >= 0; i-- ) 22 { 23 outd[i] = wdt & 0x0ff; 24 wdt >>= 8; 25 } 26}
実際の入出力例では
入力で01h,02h,11h(17),12h(18)が来た場合、
10進数で1021718(F9716h)とし、このデータをバイト毎に区切って
変換後の配列は0Fh,97h,16hになるような変換です。
■上記から理解した仕様
上記のソースと入出力例、及び、呼び出し元から以下の仕様になっていると思います。
引数として以下を受け取ります。
・*outd・・・出力先のバッファのポインタ
・outlen・・・上記バイト配列のデータ長 (1 ~ 64)
・ind・・・10進数の2桁毎の数値が入っているバイト配列
・length ・・・入力データ長 (9固定)
入力のバイト配列を
(何故そんな変換をするのかは分からないのですが)
これを10進数の整数値が2桁毎に配列に入っているとみなし、
10進数に変換後、再度、バイト配列に戻す関数を作りたいです。
ただし、変換後、出力先データ長より大きくなる場合は下の桁は切り捨てます。
01h,02h,11h(17),12h(18) → 1021718(F9716h) → 0Fh,97h,16h
入力が01h,02h,03h,04h,05h,06h,07h,08h,09h,10hとなった場合、
かつ、出力先バッファのデータ長が10、入力データ長 が9だった場合、
9バイト以降は切り捨てるので、10203040506070809(243F9C7CFE4719h)を二桁毎に区切って
24h,3Fh,9Ch,7Ch,FEh,47h,19hを出力先の配列の後ろに入れます。
なので、00h,00h,00h,24h,3Fh,9Ch,7Ch,FEh,47h,19hになります。
バイト配列は右詰になるため、9バイトに満たない場合は先頭の配列には00が入ります。
簡単に実装できるかと思ったのですが、実装しようと思ったらループが多く、
カラツバ法を調べてみたのですが、この繰り返しに対してどう実装して良いか分かりません。
何か良いアルゴリズムはありますでしょうか?
以上です。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー