Bonjour,
est ce que quelqu'un pourrait m'expliquer ce que fait l'instruction suivante :
si vous préférez, elle est utilisé dans le contexte suivant :Code:3>>1
Merci par avance...Code:vx-(3>>1)+i
Version imprimable
Bonjour,
est ce que quelqu'un pourrait m'expliquer ce que fait l'instruction suivante :
si vous préférez, elle est utilisé dans le contexte suivant :Code:3>>1
Merci par avance...Code:vx-(3>>1)+i
Tu n'as pas de livre de C ?Citation:
Envoyé par ToTo13
K&R2 Chapitre 2.9 : Opérateurs bits à bits.
>> est l'opérateur de décalage à droite.
Merci, mais j'ai posé la question car je n'ai pas bien saisi ce qu'il y avait marqué dans ce que j'ai lu :(
Donc peux tu m'expliquer combien vaut 3>>1 ?
3 en binaire (8-bit) vaut :Citation:
Envoyé par ToTo13
00000011
Si on décale de 1 vers la droite, Le 1 le plus à droite est perdu et un 0 entre à gauche :
00000011
00000001 (1 perdu)
ce qui vaut 1.
Bonjour,
merci pour cette réponse, là j'ai compris.
Mais deux questions me turlupines :
- Pourquoi utiliser vx-(3>>1)+i plutôt que vx-1+i ??? C'est tout de même tordu.
- Dans mon livre, j'ai la chose suivante :
En tout cas merci...Code:
1
2
3
4 x = 7 <=> 00000111 x = x << 1 <=> 00001110 = 14 Ok x = x << 3 <=> 01110000 = 112 ???? x = x << 2 <=> 11000000 = 192 ????
Dans un calcul, ca peut remplacer une division par 2Citation:
Envoyé par ToTo13
Je ne sais pas convertir le binaire en décimal de tête, mais en hexa, ça donne :Citation:
- Dans mon livre, j'ai la chose suivante :
Code:
1
2
3
4 x = 7 <=> 00000111 x = x << 1 <=> 00001110 = 14 Ok x = x << 3 <=> 01110000 = 112 ???? x = x << 2 <=> 11000000 = 192 ????
Code:
1
2
3
4
5
6
7
8 x = 7 <=> 00000111 x = x << 1 <=> 00001110 = 14 Ok en partant de x = 14 : x = x << 3 <=> 0111 0000 = 0x70 (64 + 32 + 16 = 112 OK) en partant de x = 112 : x = x << 2 <=> 1100 0000 = 0xC0 (c'est bien 192 de mémoire: 128 + 64)
C'est le décalage qui me chagrine...
pour le décalage de 1 je suis d'accord, mais pour trois on se retrouve avec quatres zéros au début :(
Tu veux dire 4 zéros à la fin. C'est normal puisque tu ne pars pas de x=7 mais de x=14.
Si tu partais de x=7, cela donnerait:
Code:
1
2 en partant de x = 7 : x = x << 3 <=> 0111 000 = (32 + 16 +8) = 56
Je me suis trompé. J'ai corrigé.Citation:
Envoyé par ToTo13
0000 0111 : 7
<<1
0000 1110 : 14
<<3
0001 1100 : 28
0011 1000 : 56
0111 0000 : 112
<<2
1110 0000 : 224
1100 0000 : 192
Laj,
C'est vrai, mais dans ce cas, la valeur que l'on shifte 3 est fixe, ainsi que le nombre de décalages 1, je me pose donc la même question que ToTo13 : pourquoi cette notation avec un décalage, qui ne sert à rien en soit.Citation:
Envoyé par Emmanuel Delahaye
L'ensemble des opérateurs bits servent quand les bits ont une sémantique particulière. Les données peuvent représenter autre chose qu'une valeur numérique.Citation:
Envoyé par droggo
Ca sert aussi pour comprimer des données (dans un octet, on peut mettre, par exemple une donnée booléenne (0/1), une donnée sur 3 bits (0-7) etc). C'est pratique pour stocker des dates, par exemple...
De plus, la définition en 'bits ' est portable, contrairement à l'implémentation par champs de bits, ce qui est intéressant pour les données 'ouvertes' (fichier, réseau etc.) ou les interfaces matérielles (registres de composants etc.).
Hal,
Je ne dis pas le contraire, mais je ne vois pas d'histoire de champs de bits dans l'expression en question:Citation:
Envoyé par Emmanuel Delahaye
Dans laquelle le décalage constant sur une constante conduisant à la valeur 1 ne sert absolument à rien, et où il était effectivement plus clair d'écrire directement cette valeur 1.Citation:
Envoyé par ToTo13
Sinon, pourquoi n'avoir pas joué un peu, et mis une expression de 2 ou 3 lignes, se ramenant finalement à mettre 1 ?
Je ne peux que plussoter la dessus...Citation:
Envoyé par droggo
Autant j'aurais comprisautant, l'écriture sous la forme deCode:
1
2
3
4
5 vx-(a>>b)+i /* OU */ vx-(3>>a)+i /* OU */ vx-(a>>1)+i
rajoute de la complexité là où il n'y a pas lieu d'en avoir :PCode:vx-(3>>1)+i
Ceci dit, il existe des codes dans lesquels ce genre de manoeuvres est fréquent, et dans lesquels on trouve encore bien pire :D