views:

1202

answers:

6

I know how to convert binary to decimal. I know at least 2 methods: table and power ;-)

I want to convert binary to decimal and print this decimal. Moreover, I'm not interested in this `decimal'; I want just to print it.

But, as I wrote above, I know only 2 methods to convert binary to decimal and both of them required addition. So, I'm computing some value for 1 or 0 in binary and add it to the remembered value. This is a thin place. I have a really-really big number (1 and 64 zeros). While converting I need to place some intermediate result in some 'variable'. In C, I have an `int' type, which is 4 bytes only and not more than 10^11.

So, I don't have enough memory to store intermedite result while converting from binary to decimal. As I wrote above, I'm not interested in THAT decimal, I just want to print the result. But, I don't see any other ways to solve it ;-( Is there any solution to "just print" from binary?

Or, maybe, I should use something like BCD (Binary Coded Decimal) for intermediate representation? I really don't want to use this, 'cause it is not so cross-platform (Intel's processors have a built-in feature, but for other I'll need to write own implementation).

I would glad to hear your thoughts. Thanks for patience.

Language: C.

A: 

Couldn't you allocate memory for, say, 5 int's, and store your number at the beginning of the array? Then manually iterate over the array in int-sized chunks. Perhaps something like:

int* big = new int[5];
*big = <my big number>;
Shakedown
+1  A: 

Well, when converting from binary to decimal, you really don't need ALL the binary bits at the same time. You just need the bits you are currently calculating the power of and probably a double variable to hold the results. You could put the binary value in an array, lets say i[64], iterate through it, get the power depending on its position and keep adding it to the double.

Bobby Alexander
+1  A: 

Biggest standard integral data type is unsigned long long int - on my system (32-bit Linux on x86) it has range 0 - 1.8*10^20 which is not enough for you, so you need to create your own type (struct or array) and write basic math (basically you just need an addition) for that type.

If I were you (and memory is not an issue), I'd use an array - one byte per decimal digit rather then BCD. BCD is more compact as it stores 2 decimal digits per byte but you need to put much more effort working with high and low nibbles separately.

And to print you just add '0' (character, not digit) to every byte of your array and you get a printable string.

qrdl
Yes, after the night, I've came to the same solution ;-)
+3  A: 

I highly recommend using a library such as GMP (GNU multiprecision library). You can use the mpz_t data type for large integers, the various import/export routines to get your data into an mpz_t, and then use mpz_out_str() to print it out in base 10.

Adam Rosenfield
Seconded. GMP makes this stuff easy.
Dietrich Epp
I know about GMP well, but I isn't what I want.
Why do you not want GMP? Does LGPL not work for you? It takes about 3 function calls to achieve what you want (import, print, cleanup), and it'll be faster and less buggy than anything you can come up with.
Adam Rosenfield
+1  A: 

Converting to decimal really means calculating each power of ten, so why not just store these in an array of bytes? Then printing is just looping through the array.

Robert
A: 

Ei! Today I've just answered a question related with your problem!

Take a look my code, there are some functions that could be useful for your purpose.

saxi