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 :
exercice pour toi: vérifie que tu comprends bien comment ça fonctionne ;-)
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 ;-)