[C]: Fonction StringToBin

Fermé
sonia - 16 janv. 2006 à 22:50
 cataclypse - 18 janv. 2006 à 10:06
Bonsoir,

Voilà je n'arrive pas à comment marche la fonction qui transforme une représentation binaire d'un entier en sa valeur.

En fait le but est d'abord de vérifier si une chaine de caractère (représentation binaire d'un entier) n'est composée que de 0 et de 1, ensuite si cela est vrai elle doit retourner la valeur de cet entier.

D'apres le peu que j'ai compris , on utilise un 'mask' valant 1 au départ et puis on parcourt la chaine de droite à gauche et une fois qu'on a trouvé qu un bit est égal un 1, on fait (n=n|mask)...
et c'est cette étape que je n'arrive pas à saisir...
Si quelqu un peut m'aider à comprendre cette fois, je lui serait reconnaissante..

Cordialement


int StrToBin(char *str)

  {
   int mask=1;
   int n=0;
   int l=strlen(str)-1;

while(c<=str)
         {if (*c!='0' && *c!='1')
                  error(1);
          if(*c=='1')
               {n=n|mask;
                mask<< 1;
               c--;
          }
return n ;
}

1 réponse

l'opérateur | est le or binaire, cad qu'il fonctionne au niveau des bits de n.

exemple : la chaine d'entrée est "101" (soit 5 écrit en binaire) et n est initialisé à 0 et mask à 1

boucle 0 : n = n | mask

n : 0000
mask : 0001
or ------------
n : 0001

puis on shift mask d'un bit vers la gauche (mask = 0010)

boucle 1 : le caractère dans la chaine est un zéro, on shift mask d'un bit vers la gauche (mask = 0100)

boucle 2 : n = n | mask

n : 0001
mask : 0100
or ------------
n : 0101

et on shift mask

fin de la boucle. On a donc positionné correctement les bits de n. afficher sa valeur en décimal donnera donc 5.

On observe que :
- un ou binaire (|) avec 0...0001 revient à forcer le lsb à 1
- un et binaire (&) avec 1...1110 revient à forcer le lsb à 0
(lsb = bit de poids faible = bit[0])

personnellement, j'aurais écrit la fonction comme ceci :

int StrToBin(char *str)
{
	int l = strlen(str)-1;
	int n = 0;
	int c, j;
	for (j = 0; j <= l; j++)
	{
		c = (str[j] == '0' ? 0 : 1);
		n |= (c << (l-j));
	}
	return n ;
}


exercice pour toi: vérifie que tu comprends bien comment ça fonctionne ;-)
0