假设我有一个包含1024个字符的字符串(代表0和1)。我想将它作为十进制数字(也作为字符串)呈现。棘手的部分是我必须在没有第三部分库的情况下在C / C ++中完成。有线索吗?
答案 0 :(得分:5)
可能有更有效的方法,但我有一个十进制数字数组,并在其上实现一个“左移”功能,它从最低有效数字运行,加倍并继续进入下一个数字。
这只是一次读取二进制数据的工作,并且“左移”十进制数组,并根据需要在二进制数字中“或”。
只需迭代十进制数字即可打印出答案。
void outputAsDecimal(char *binary)
{
char digits[1000]; // arbitrary size for now
for (int i=0; i< 1000; ++i)
digits[i] = 0;
while (*binary != 0)
{
// shift the digits, with carry
int carry = 0;
for (int i = 0; i< 1000; ++i)
{
int d = digits[i] *2 + carry;
carry = d > 9;
digits[i] = d % 10;
}
// or in the new bit
if (*binary++ == '1')
digits[0] |= 1;
}
// output with leading zeroes!
for (int i = 999; i >=0; --i)
{
putchar(digits[i] + '0'); // convert to ascii
}
}
看到它在这里运行:http://ideone.com/CibAfw
答案 1 :(得分:1)
边界的数学很烦人,但并非不可能。如果你无法弄明白,请告诉我。
这对我有用。分解和支持值大于(int)中提供的值是留给读者的练习......
#include <stdio.h> // only to print - not needed in computation
int main(int argc, char *argv[]) {
printf("Converting: %s\n", argv[1]);
int number = 0x0;
char * binaryString = argv[1];
int index = 0;
int asciiZero = '0';
char curr = binaryString[index];
while(curr != '\0') {
number = (number << 1) | (curr - asciiZero);
index++;
curr = binaryString[index];
}
printf("As number: %d\n", number);
int MAX_DIGITS = 10; //adjust accordingly...
char buffer[MAX_DIGITS];
index = 0;
while(number > 0) {
buffer[index] = ((char) number % 10) + asciiZero;
index++;
number = number / 10;
}
buffer[index] = '\0';
printf("As string: %s\n", buffer);
}
如果你想支持更多可用的原语,你可以创建一个包含多个整数/长/等的结构。
答案 2 :(得分:-1)
您不能将1024位数字表示为小数。你可以得到的最接近的是浮点近似值。
编辑:
出现了一个想法。将数字放在堆栈中并按这种方式计算。仍然要弄清楚如何将它们加在一起。如果你想这样做,你将不得不实现你自己的BigInt库,就我所能想象的那样,并不是一种“微不足道”的方式。
这样的事情是一个很好的起点: