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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.