[C++] Opérateur >>>
Résolu/Fermé
hamzafes
Messages postés
243
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
4 mai 2013
-
23 févr. 2009 à 18:12
hamzafes Messages postés 243 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 4 mai 2013 - 24 févr. 2009 à 14:16
hamzafes Messages postés 243 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 4 mai 2013 - 24 févr. 2009 à 14:16
9 réponses
Re salut,
Après test, >> et la division par 2 font ce que tu veux, mais uniqument sur les entiers non signés. Donc, le plus pratique est je pense de faire quelque chose du genre :
int i= ... ;
unsigned int ui = (unsigned int)(i); // transtypage explicite. Les bits de la variable sont recopiés tels quels, mais leur interprétation change
int i2 = (int) (ui >> 2) // re transtypage dans l'autre sens de l'opération de décalage
Si il est certain que i est positif, le transtypage n'est aps nécessaire, et il suffit de faire i2 = (i >> 2);
Après test, >> et la division par 2 font ce que tu veux, mais uniqument sur les entiers non signés. Donc, le plus pratique est je pense de faire quelque chose du genre :
int i= ... ;
unsigned int ui = (unsigned int)(i); // transtypage explicite. Les bits de la variable sont recopiés tels quels, mais leur interprétation change
int i2 = (int) (ui >> 2) // re transtypage dans l'autre sens de l'opération de décalage
Si il est certain que i est positif, le transtypage n'est aps nécessaire, et il suffit de faire i2 = (i >> 2);
Salut,
Aucune mention de cet opérateur dans la dernière édition du Stroustrup. A mon avis, ce n'est pas un truc standard...
Aucune mention de cet opérateur dans la dernière édition du Stroustrup. A mon avis, ce n'est pas un truc standard...
hamzafes
Messages postés
243
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
4 mai 2013
54
23 févr. 2009 à 18:19
23 févr. 2009 à 18:19
merci, est ce qu'il y a une alternative.
comment je peux réaliser la même opération sans cet opérateur???
comment je peux réaliser la même opération sans cet opérateur???
Hmmm, si cette opération est un bête décalage, il te suffit de diviser par 2 ton entier autant de fois que tu veux dacaler les bits. (pour 2 bits, divises par 4, pour 3 bits par 8, etc.)
donc, I2 = I / 4 dans ton cas.
donc, I2 = I / 4 dans ton cas.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
hamzafes
Messages postés
243
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
4 mai 2013
54
23 févr. 2009 à 19:32
23 févr. 2009 à 19:32
<< Rotation à gauche : Décale les bits vers la gauche (multiplie par 2 à chaque décalage). Les zéros qui sortent à gauche sont perdus, tandis que des zéros sont insérés à droite
>> Rotation à droite avec conservation du signe : Décale les bits vers la droite (divise par 2 à chaque décalage). Les zéros qui sortent à droite sont perdus, tandis que le bit non nul de poids plus fort est recopié à gauche
>>> Rotation à droite avec remplissage de zéros : Décale les bits vers la droite (divise par 2 à chaque décalage). Les zéros qui sortent à droite sont perdus, tandis que des zéros sont insérés à gauche
Moi je cherche la dernière "avec remplissage de zéros"
est ce que la division remplit cette tâche?
>> Rotation à droite avec conservation du signe : Décale les bits vers la droite (divise par 2 à chaque décalage). Les zéros qui sortent à droite sont perdus, tandis que le bit non nul de poids plus fort est recopié à gauche
>>> Rotation à droite avec remplissage de zéros : Décale les bits vers la droite (divise par 2 à chaque décalage). Les zéros qui sortent à droite sont perdus, tandis que des zéros sont insérés à gauche
Moi je cherche la dernière "avec remplissage de zéros"
est ce que la division remplit cette tâche?
hamzafes
Messages postés
243
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
4 mai 2013
54
23 févr. 2009 à 22:04
23 févr. 2009 à 22:04
Merci, je vais essayer ça
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
24 févr. 2009 à 10:26
24 févr. 2009 à 10:26
Salut.
Pas de trace de cet opérateur dans la norme de 2005 :
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
Peut être une nouvelle extension. Si ton compilateur est pas récent, ou si ça se trouve c'est dans une nouvelle norme mais pas encore intégrer dans le compilateur.
Pas de trace de cet opérateur dans la norme de 2005 :
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
Peut être une nouvelle extension. Si ton compilateur est pas récent, ou si ça se trouve c'est dans une nouvelle norme mais pas encore intégrer dans le compilateur.
hamzafes
Messages postés
243
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
4 mai 2013
54
24 févr. 2009 à 14:16
24 févr. 2009 à 14:16
En fait, ce que je voulais faire c'était de lire un entier octet par octet et le stocker de la même façon.
La version java du programme fait comme ceci:
write((byte)((I >>> 24) & 0xFF));
write((byte)((I >>> 16) & 0xFF));
write((byte)((I >>> 8) & 0xFF));
write((byte)((I >>> 0) & 0xFF));
Vous trouverez ce code dans la source de la classe RandomAccessFile.
Pour des raisons de compatibilité avec d'autres programmes (qui étaient réalisés en C++) je suis obligé de traduire mon programme en C++.
L'alternative qui marche jusqu'à maintenant est à peu prés celle proposée par Jamian (message 6).
et donc le codes est devenu:
write((char)(((long int) (I >> 0)) & 0xFF));
write((char)(((long int) (I >> 8)) & 0xFF));
write((char)(((long int) (I >> 16)) & 0xFF));
write((char)(((long int) (I >> 24)) & 0xFF));
I ici est un long int (4 octs)
Merci à vous tous
Allah mo3ine
La version java du programme fait comme ceci:
write((byte)((I >>> 24) & 0xFF));
write((byte)((I >>> 16) & 0xFF));
write((byte)((I >>> 8) & 0xFF));
write((byte)((I >>> 0) & 0xFF));
Vous trouverez ce code dans la source de la classe RandomAccessFile.
Pour des raisons de compatibilité avec d'autres programmes (qui étaient réalisés en C++) je suis obligé de traduire mon programme en C++.
L'alternative qui marche jusqu'à maintenant est à peu prés celle proposée par Jamian (message 6).
et donc le codes est devenu:
write((char)(((long int) (I >> 0)) & 0xFF));
write((char)(((long int) (I >> 8)) & 0xFF));
write((char)(((long int) (I >> 16)) & 0xFF));
write((char)(((long int) (I >> 24)) & 0xFF));
I ici est un long int (4 octs)
Merci à vous tous
Allah mo3ine