说,我的电话号码是0.1e + 308。如何获取指数308(以10为底)并找到正确的十六进制指数(以16为底)?
我不仅仅是将308转换为十六进制。 - 这很容易!我想找到e308的等效十六进制数字。
我需要这个,因为我有一个例程将正确的零添加到数字的末尾。我使用十进制(以10为底),但是我的例程花费了太长时间(〜20秒)来找到答案。
但是,如果我使用十六进制,则可以在不到一秒钟的时间内找到结果。因为将基数16转换为二进制非常快。
我要计算的数字很大,所以想想像BigInteger这样的数字。但是我正在用C ++编写代码。
编辑1
这是我的将十进制字符串转换为二进制位数组的例程。
case 10:
bitsSum = bits_duplicate(bitsDst);
if (bitsSum == NULL)
goto error;
bitsTen = bits_create_value(maxBits, 10);
if (bitsTen == NULL)
goto error;
int len = str_chars_length(strDup);
char c;
for (i = 0; i < len; i++) {
c = strDup[i] - '0';
if (c == 0)
continue;
if (bits_set(bitsSum, c) == 0)
goto error;
for (k = 0; k < len - i - 1; k++) {
if (bits_multiply(bitsTen, bitsSum) == 0)
goto error;
}
if (bits_add(bitsSum, bitsDst) == 0)
goto error;
}
break;
您可以清楚地看到,将字符串值转换为等效的二进制数组很慢,因为它需要乘法和加法。
但是我将十六进制字符串转换为二进制位数组的例程非常快:
d = ((strDup[i] >= '0' && strDup[i] <= '9') ? strDup[i] - '0' : (strDup[i] >= 'a' && strDup[i] <= 'f') ? strDup[i] - 'a' + 10 : strDup[i] - 'A' + 10);
bitsDst->bitArray[k++] = (d & 1) ? 1 : 0;
bitsDst->bitArray[k++] = (d & 2) ? 1 : 0;
bitsDst->bitArray[k++] = (d & 4) ? 1 : 0;
bitsDst->bitArray[k++] = (d & 8) ? 1 : 0;
答案 0 :(得分:2)
0.1e + 308 = 10 ^ 307
Log10(10 ^ 307)= 307
Log16(10 ^ 307)= Log10(10 ^ 307)/ Log10(16)= 307 / Log10(16)