14

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?

1

8 Answers 8

31

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

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

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

Sign up to request clarification or add additional context in comments.

2 Comments

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.
oh right. Me, I'd probably have used "0" after the compiler told me about the error :-)
13

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;

2 Comments

found even more fancy solution..` while (len--) {ret = (ret << 1) | (*bits++ & 1);}`
I believe you need to start at end and work right to left.
0

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

Comments

0

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;
  }
}

Comments

0

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;
}

Comments

0

Use like this:

char c[20];
int s=23;

itoa(s,c,2);
puts(c);

Output:

10111

1 Comment

Note: itoa is a non-standard C function
0

To answer the second part of the question.

char* get_binary_string(uint16_t data, unsigned char sixteen_bit)
{
    char* ret = NULL;
    if(sixteen_bit) ret = (char*)malloc(sizeof(char) * 17);
    else ret = (char*)malloc(sizeof(char) * 9);
    if(ret == NULL) return NULL;

    if(sixteen_bit){
        for(int8_t i = 15; i >= 0; i--){
            *(ret + i) = (char)((data & 1) + '0');
            data >>= 1;
        }
        *(ret + 16) = '\0';
        return ret;
    }else{
        for(int8_t i = 7; i >= 0; i--){
            *(ret + i) = (char)((data & 1) + '0');
            data >>= 1;
        }
        *(ret + 8) = '\0';
        return ret;
    }
    return ret;
}

Comments

0

To answer the first part of your question, here is a neat little function I created to convert Binary char strings to integers.

 // Function used to change binary character strings to integers
int binToDec(char binCode[])
{
    while (binCode != NULL)
    {
        int base = strlen(binCode) - 1; // the base of 2 to be multiplied, we start of -1 because we dont account for the last bit here
        int sum = 0;
        for (int i = 0; i < strlen(binCode) - 1; i++) // we do not account for the last bit of the binary code here....
        {
            int decimal = 1;
            if (binCode[i] == '1')
            {
                for (int j = 0; j < base; j++) // we want to just multiply the number of true bits (not including the 1)
                {
                    decimal = decimal * 2;  
                }

                base = base - 1; // subtract base by 1 since we are moving down the string by 1
            }
            else // we encounter a zero
            {
                base = base - 1; // subtract a base multiple every time we encounter a zero...
                continue;        // carry on with the code
            }
            sum += decimal;
           // starting from the left (higher power) to the end (lowest power or 1)
        }
        for (int j = strlen(binCode) - 1; j < strlen(binCode) + 1; j++)
        { // accounting for the endian bit that is always 1
            if (binCode[j] == '1')
            {
                sum += 1; // add 1 to the sum total
            }
        }
        return sum; // return the sum as an int
    }
    return 0;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.