基数 10 表現 (つまり、配列の各セルの 10 進数) を取得しようとしています。この方法では、スペース (1 桁あたり 1 つの int) または時間 (1 桁あたり 4 ビットですが、パック/アンパックのオーバーヘッドがあります) が無駄になります。
たとえば、base-256 を試してみて、バイトの配列を使用してみませんか? または、整数の配列を使用した base-2^32 でさえありますか? 操作は base-10 と同じ方法で実装されます。異なるのは、数値を人間が読める文字列に変換することだけです。
次のように機能します: base-256 を想定すると、各「数字」には 256 の可能な値があるため、0 ~ 255 の数字はすべて 1 桁の値になります。256 は 1:0 として書かれます (「数字」を区切るためにコロンを使用します。基数 16 のように文字を使用することはできません)。基数 10 の類推は、9 の後に 10 がある方法です。 -10) = 4 * 256 + 6 = 4:6 (base-256)。また、1020 (base-10) = 3 * 256 + 252 = 3:252 (base-256) は、base-256 の 2 桁の数値です。
ここで、最下位桁が最初になるようにバイト配列に数字を入れると仮定しましょう。
unsigned short digits1[] = { 212, 121 }; // 121 * 256 + 212 = 31188
int len1 = 2;
unsigned short digits2[] = { 202, 20 }; // 20 * 256 + 202 = 5322
int len2 = 2;
次に、追加は次のようになります(警告:メモ帳のコードは壊れている可能性があります):
unsigned short resultdigits[enough length] = { 0 };
int len = len1 > len2 ? len1 : len2; // max of the lengths
int carry = 0;
int i;
for (i = 0; i < len; i++) {
int leftdigit = i < len1 ? digits1[i] : 0;
int rightdigit = i < len2 ? digits2[i] : 0;
int sum = leftdigit + rightdigit + carry;
if (sum > 255) {
carry = 1;
sum -= 256;
} else {
carry = 0;
}
resultdigits[i] = sum;
}
if (carry > 0) {
resultdigits[i] = carry;
}
最初の反復では、次のようになります。
- 合計 = 212 + 202 + 0 = 414
- 414 > 256 なので、キャリー = 1 で合計 = 414 - 256 = 158
- 結果桁[0] = 158
2 回目の繰り返しで:
- 合計 = 121 + 20 + 1 = 142
- 142 < 256 なので、キャリー = 0
- 結果桁数[1] = 142
したがって、最後の resultdigits[] = { 158, 142 }、つまり 142:158 (base-256) = 142 * 256 + 158 = 36510 (base-10) となり、正確には 31188 + 5322 になります。
この数値を人間が読める形式に変換することは、決して簡単な作業ではないことに注意してください。10 または 256 による乗算と除算が必要であり、適切な調査なしにサンプルとしてコードを提示することはできません。利点は、演算「加算」、「減算」、および「乗算」を非常に効率的に行うことができ、基数 10 との間の大量の変換が計算の最初と最後に 1 回だけ行われることです。
そうは言っても、個人的には、バイト配列で基数 10 を使用し、メモリの損失は気にしません。これには、上記の定数 255 と 256 をそれぞれ 9 と 10 に調整する必要があります。