Instruction dans un code C [Résolu]

Signaler
Messages postés
16
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
23 novembre 2007
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour à tous,

Je suis en train de lire un algorithme en c++ (détail: de calcul du spectre d'un signel) J'ai trouvé une commande comme celle là:

X[k] = Y[k<<1] * Y[k<<1] + Y[1+(Y<<1)] * Y[1+(k<<1)]

Je ne comprends pas ce que veux dire (k<<1).
Si quelqu'un pourrait bien m'aider, ce sera très gentil.

C'EST URGENT !!!

Merci.

7 réponses

Messages postés
338
Date d'inscription
samedi 9 août 2003
Statut
Membre
Dernière intervention
9 juillet 2011
2
venant du site http://www.commentcamarche.net/c/cop.php3


(Les opérateurs de décalage de bit)

Si vous ne comprenez pas ces opérateurs cela n'est pas important, vous n'en aurez probablement pas l'utilité.
Pour ceux qui voudraient comprendre, rendez-vous aux chapitres suivants :



<li>
Compréhension du binaire
</li>
<li>
Représentation des données
</li>
<li>
Instructions arithmétiques et logiques en assembleur
</li>

Ce type d'opérateur traite ses opérandes comme des données binaires
d'une longueur de 32 bits,
plutôt que des données décimales, hexadécimales ou octales.
Ces opérateurs traitent ces données selon leur représentation binaire
mais retournent des valeurs numériques standard dans leur format d'origine.



Les opérateurs suivants effectuent des décalages sur les bits, c'est-à-dire
qu'ils décalent chacun des bits d'un nombre de positions vers la gauche ou vers la droite.
La première opérande désigne la donnée sur laquelle on va faire le décalage,
la seconde désigne le nombre de décalages.






Opérateur |
Dénomination |
Effet |
Syntaxe |
Résultat |

----

<<,
Décalage à 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,
6 << 1 (110 << 1),
12 (1100),

----

>>,
Décalage à 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,
6 >> 1 (0110 >> 1),
3 (0011)
Messages postés
16
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
23 novembre 2007

Merci pour cette réponse, je crois comprendre de quoi il s'agit: c'est comme si on voulait dire:

X[k] = Y[2*k] * Y[2*k] + Y[2*k+1] * Y[2*k+1]

Le carré des élém pairs et impairs, car déja Y est calculé sur le princupe de séparation de parité.

Merci encore et j'espère que je me trompe pas sur cette explication.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Précision TRES importante.
Le C traduira les décalages avec ou sans conservation signe et en rotation au lieu de simple shift selon que sera nbr signé ou non (int ou DWORD), simple shift pour DWORD.

Pour résumer:
int n;
n >>= 2;
donnera: sar eax, 2

DWORD n;
n >>= 2;
donnera: shr eax, 2

"probablement jamais l'utilité": c'est une plaisanterie j'espère.

ciao...
BruNews, MVP VC++
Messages postés
16
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
23 novembre 2007

Cela m'a vraiment échappé,
En somme si je veux traduire cette instruction en un autre language ou en un simple desciption mathématique, ce sera quoi la signification ou les effets?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Comme tu l'as mis plus haut devrait aller.

ciao...
BruNews, MVP VC++
Messages postés
16
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
23 novembre 2007

Je n'ai bien compris la remarque de  BruNews, mais je me rend compte que ce n'est pas un simple multiplication par 2 avec les bits alloués pour le signe pour dans le cas de très grand nombre où le décalage nécessite une rotation.
Je pensais que dans mon cas il s'agit d'indice de tableau dont pas de pbl de signe et non plus de taille, donc ça marche bien cm muptiplication.
Mais les indices sont de type int  et ce type contient  les bits de signe.

Donc je ne comprends toujours pas comment je dois interpréter mathématiquement cette instruction.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Avec un indice de tableau ayant bit de signe positionné (donc négatif) tu es >= 2Go d'alloc donc plantage.
Plus de probs dans ce cas...

ciao...
BruNews, MVP VC++