[C++] Opérateur >>>
Résolu
hamzafes
Messages postés
243
Date d'inscription
Statut
Membre
Dernière intervention
-
hamzafes Messages postés 243 Date d'inscription Statut Membre Dernière intervention -
hamzafes Messages postés 243 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- [C++] Opérateur >>>
- Opérateur de réseau mobile - Guide
- 0466 quel opérateur - Forum Mobile
- 0668 quel opérateur ✓ - Forum Mobile
- 0758 quel opérateur - Forum Opérateurs & Réseaux mobiles
- 0650 quel opérateur - Forum Mobile
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...
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
<< 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?
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.
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