Instruction dans un code C

Résolu
fatenov Messages postés 16 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 23 novembre 2007 - 15 nov. 2007 à 11:18
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 15 nov. 2007 à 14:21
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

gamemonde Messages postés 336 Date d'inscription samedi 9 août 2003 Statut Membre Dernière intervention 9 juillet 2011 2
15 nov. 2007 à 11:25
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)
3
fatenov Messages postés 16 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 23 novembre 2007
15 nov. 2007 à 11:34
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 nov. 2007 à 12:38
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++
0
fatenov Messages postés 16 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 23 novembre 2007
15 nov. 2007 à 13:16
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?
0

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

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 nov. 2007 à 13:31
Comme tu l'as mis plus haut devrait aller.

ciao...
BruNews, MVP VC++
0
fatenov Messages postés 16 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 23 novembre 2007
15 nov. 2007 à 13:55
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 nov. 2007 à 14:21
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++
0
Rejoignez-nous