[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
Salam,

j'utilise l'opérateur de "Rotation à droite avec remplissage de zéros" >>>, en java aucun problème.
mais en C++ je rencontre l'erreur "expected primary-expression before '>' token" (je travail avec Code::Blocks 8.02)

Exemple:

int I=125;
int I2= I >>> 2 ;

Les autres opérateurs de rotation << et >> sont acceptés sauf celui là.

y a t il quelqu'un qui peut m'expliquer pourquoi???

l'opérateur existe vous pouvez le voir ici : https://www.commentcamarche.net/contents/191-langage-c-les-operateurs en bas de page

Merci d'avance

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);
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...
0
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
merci, est ce qu'il y a une alternative.
comment je peux réaliser la même opération sans cet opérateur???
0
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
En C, le décalage à droite ou à gauche est tout simplement et respectivement: >> et >>
0
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
<< 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?
0
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
Merci, je vais essayer ça
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
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.
0
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
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
0