質問編集履歴
3
元データの間違い
title
CHANGED
File without changes
|
body
CHANGED
@@ -49,7 +49,7 @@
|
|
49
49
|
これを10進数の整数値が2桁毎に配列に入っているとみなし、
|
50
50
|
10進数に変換後、再度、バイト配列に戻す関数を作りたいです。
|
51
51
|
ただし、変換後、出力先データ長より大きくなる場合は下の桁は切り捨てます。
|
52
|
-
01h,02h,11h(17),
|
52
|
+
01h,02h,11h(17),12h(18) → 1021718(F9716h) → 0Fh,97h,16h
|
53
53
|
|
54
54
|
入力が01h,02h,03h,04h,05h,06h,07h,08h,09h,10hとなった場合、
|
55
55
|
かつ、出力先バッファのデータ長が10、入力データ長 が9だった場合、
|
2
データ変換の間違い
title
CHANGED
File without changes
|
body
CHANGED
@@ -31,7 +31,7 @@
|
|
31
31
|
}
|
32
32
|
```
|
33
33
|
実際の入出力例では
|
34
|
-
入力で01h,02h,11h(17),
|
34
|
+
入力で01h,02h,11h(17),12h(18)が来た場合、
|
35
35
|
10進数で1021718(F9716h)とし、このデータをバイト毎に区切って
|
36
36
|
変換後の配列は0Fh,97h,16hになるような変換です。
|
37
37
|
|
1
事前の情報とそこから理解した仕様の分離、変換の途中データの追加、切り捨て桁数の間違いの修正、切り捨て例の追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,16 +1,9 @@
|
|
1
1
|
多倍長整数の演算で悩んでいます。
|
2
2
|
longまでしかない32bitマイコンでC言語で多倍長整数の演算を行いたいと思っています。
|
3
3
|
|
4
|
-
入力として9バイトまでのバイト配列があり、
|
5
|
-
(何故そんな変換をするのかは分からないのですが)
|
6
|
-
これを10進数の9桁の整数値に変換する関数を作りたいです。
|
7
|
-
|
8
|
-
入力で01h,02h,11h,22hが来た場合、
|
9
|
-
10進数で1021122と見なし、
|
10
|
-
変換後の配列は00h,0Fh,97h,16hになるような変換です。
|
11
|
-
|
12
|
-
long longが使える元ソース
|
4
|
+
long longが使える元々実装されている以下のソースを、long longが実装されていない処理系に移植する必要があります。
|
13
5
|
```C
|
6
|
+
#define HUNDREDKETA 9
|
14
7
|
const QWORD hundredk[HUNDREDKETA] = { 1L, // 0: 1の位
|
15
8
|
100L, // 1: 100の位
|
16
9
|
10000L, // 2:
|
@@ -36,12 +29,36 @@
|
|
36
29
|
wdt >>= 8;
|
37
30
|
}
|
38
31
|
}
|
32
|
+
```
|
33
|
+
実際の入出力例では
|
34
|
+
入力で01h,02h,11h(17),22h(18)が来た場合、
|
35
|
+
10進数で1021718(F9716h)とし、このデータをバイト毎に区切って
|
36
|
+
変換後の配列は0Fh,97h,16hになるような変換です。
|
39
37
|
|
38
|
+
■上記から理解した仕様
|
39
|
+
上記のソースと入出力例、及び、呼び出し元から以下の仕様になっていると思います。
|
40
40
|
|
41
|
-
```
|
42
|
-
|
41
|
+
引数として以下を受け取ります。
|
42
|
+
・*outd・・・出力先のバッファのポインタ
|
43
|
+
・outlen・・・上記バイト配列のデータ長 (1 ~ 64)
|
43
|
-
|
44
|
+
・ind・・・10進数の2桁毎の数値が入っているバイト配列
|
45
|
+
・length ・・・入力データ長 (9固定)
|
44
46
|
|
47
|
+
入力のバイト配列を
|
48
|
+
(何故そんな変換をするのかは分からないのですが)
|
49
|
+
これを10進数の整数値が2桁毎に配列に入っているとみなし、
|
50
|
+
10進数に変換後、再度、バイト配列に戻す関数を作りたいです。
|
51
|
+
ただし、変換後、出力先データ長より大きくなる場合は下の桁は切り捨てます。
|
52
|
+
01h,02h,11h(17),22h(18) → 1021718(F9716h) → 0Fh,97h,16h
|
53
|
+
|
54
|
+
入力が01h,02h,03h,04h,05h,06h,07h,08h,09h,10hとなった場合、
|
55
|
+
かつ、出力先バッファのデータ長が10、入力データ長 が9だった場合、
|
56
|
+
9バイト以降は切り捨てるので、10203040506070809(243F9C7CFE4719h)を二桁毎に区切って
|
57
|
+
24h,3Fh,9Ch,7Ch,FEh,47h,19hを出力先の配列の後ろに入れます。
|
58
|
+
なので、00h,00h,00h,24h,3Fh,9Ch,7Ch,FEh,47h,19hになります。
|
59
|
+
|
60
|
+
バイト配列は右詰になるため、9バイトに満たない場合は先頭の配列には00が入ります。
|
61
|
+
|
45
62
|
簡単に実装できるかと思ったのですが、実装しようと思ったらループが多く、
|
46
63
|
カラツバ法を調べてみたのですが、この繰り返しに対してどう実装して良いか分かりません。
|
47
64
|
何か良いアルゴリズムはありますでしょうか?
|