2010-02-26 14 views

risposta

10

Se si tratta di un problema di compiti a casa che probabilmente vogliono di implementare strtol, si avrebbe un qualcosa di ciclo come questo:

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

Se si voleva ottenere l'immaginazione si potrebbe usare questi nel ciclo: "? in C "

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

ha trovato una soluzione ancora più divertente ... mentre (len--) {ret = (ret << 1) | (* bit ++ & 1);} ' –

19

La funzione strtol nella libreria standard prende un parametro di "base", che in questo caso sarebbe 2.

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

(primo codice C che ho scritto in circa 8 anni :-)

+2

@Pointy: Nice code dopo 8 anni: P :) – t0mm13b

+1

In C, non esiste un letterale "null" incorporato. C'è una macro, NULL, quindi ha bisogno di essere upper-cased. Inoltre, l'argomento stringa dovrebbe essere reso "const", poiché la funzione non lo modificherà. – unwind

+0

oh giusto. Io probabilmente avrei usato "0" dopo che il compilatore mi ha detto dell'errore :-) – Pointy

0

Credo che in realtà dipenda da alcune domande sul tuo programma/stringhe. Se, ad esempio, sapessi che il tuo numero non sarebbe più grande di 255 (IE stavi usando solo 8 bit o 8 0s/1s), potresti creare una funzione in cui devi passarlo a 8 bit dalla tua stringa, attraversarlo e aggiungere ad una somma che hai restituito ogni volta che colpisci un 1. IE se colpisci il bit per 2^7 aggiungi 128 e il prossimo bit che colpisci è 2^4 add 16.

Questa è la mia idea veloce e sporca. Penso di più e Google per te a scuola. : D

0

per la seconda parte della domanda, vale a dire" come faccio a convertire un int, come 5, ad una stringa" 101, provare qualcosa di simile:

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

È possibile utilizzare il seguente codifica

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

Usa come questo:

char c[20]; 
int s=23; 

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

uscita:

10111 
+0

Nota:' itoa' è una funzione C non standard –