tags:

views:

229

answers:

5

How do I convert a binary string like "010011101" to an int, and how do I convert an int, like 5, to a string "101" in C?

+8  A: 

The strtol function in the standard library takes a "base" parameter, which in this case would be 2.

int fromBinary(char *s) {
  return (int) strtol(s, null, 2);
}

(first C code I've written in about 8 years :-)

Pointy
@Pointy: Nice code after 8 years :P :)
tommieb75
In C, there is no built-in "null" literal. There's a macro, NULL, so it needs to be upper-cased. Also, the string argument should be made "const", since the function won't modify it.
unwind
oh right. Me, I'd probably have used "0" after the compiler told me about the error :-)
Pointy
A: 

I guess it really depends on some questions about your strings/program. If, for example, you knew your number wouldn't be bigger than 255 (IE you were only using 8 bits or 8 0s/1s), you could create a function where you hand it 8 bits from your string, traverse it and add to a sum that you returned everytime you hit a 1. IE if you hit the bit for 2^7 add 128 and the next bit you hit was 2^4 add 16.

This is my quick and dirty idea. I think more and Google for ya while at school. :D

Chris
+1  A: 

If it is a homework problem they probably want you to implement strtol, you would have a loop something like this:

char* start = &binaryCharArray[0];
int total = 0;
while (*start)
{
 total *= 2;
 if (*start++ == '1') total += 1;
}

If you wanted to get fancy you could use these in the loop:

   total <<= 1;
   if (*start++ == '1') total^=1;
Winder
A: 

For the 2nd part of the question, i.e. "how do I convert an int, like 5, to a string "101" in C?", try something like:

void
ltostr( unsigned long x, char * s, size_t n )
{
  assert( s );
  assert( n > 0 );

  memset( s, 0, n );
  int pos = n - 2;

  while( x && (pos >= 0) )
  {
    s[ pos-- ] = (x & 0x1) ? '1' : '0'; // Check LSb of x
    x >>= 1;
  }
}
ArunSaha
A: 

Dear Friend,

You can use the following coding

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void)
{
   int nRC = 0;
   int nCurVal = 1;
   int sum = 0;
   char inputArray[9];
   memset(inputArray,0,9);
   scanf("%s", inputArray);
   // now walk the array:
   int nPos = strlen(inputArray)-1;
   while(nPos >= 0)
   {
      if( inputArray[nPos] == '1')
      {
         sum += nCurVal;
      }
      --nPos;
      nCurVal *= 2;
   }
   printf( "%s converted to decimal is %d\n", inputArray, sum);
   return nRC;
}
muruga