Convertir cadena de formato binario a int, en C

¿Cómo convierto una cadena binaria como “010011101” a un int, y cómo convierto una int, como 5, a una cadena “101” en C?

Si es un problema de tarea, probablemente quieran que implementes strtol , tendrías un bucle similar a este:

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

Si quisieras obtener fantasía, podrías usar esto en el bucle:

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

La función strtol en la biblioteca estándar toma un parámetro “base”, que en este caso sería 2.

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

(Primer código C que he escrito en unos 8 años 🙂

Supongo que realmente depende de algunas preguntas acerca de sus cadenas / progtwig. Si, por ejemplo, sabía que su número no sería mayor que 255 (es decir, solo estaba usando 8 bits u 8 0s / 1s), podría crear una función en la que le dé 8 bits de su cadena, la atraviese y agregue a una sum que devolviste cada vez que golpeas un 1. IE si golpeas el bit para 2 ^ 7 agrega 128 y el siguiente bit que golpeas es 2 ^ 4 agrega 16.

Esta es mi idea rápida y sucia. Pienso más y busco Google para ti mientras estás en la escuela. :RE

Para la segunda parte de la pregunta, es decir, “¿cómo convierto un int, como 5, a una cadena” 101 “en C?”, Intente algo como:

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

Puede utilizar la siguiente encoding

 #include  #include  #include  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 así:

 char c[20]; int s=23; itoa(s,c,2); puts(c); 

Salida:

 10111 

Para contestar la segunda parte de la pregunta.

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