开发者

Convert binary format string to int, in C

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?


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 :-)


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;


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


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


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


Use like this:

char c[20];
int s=23;

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

Output:

10111


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


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜