Question

J'utilise un dsPIC33F et GCC. Je veux tourner les bits dans un mot une fois gauche ou à droite, comme ceci:

       MSB             LSB
input: 0101 1101 0101 1101
right: 1010 1110 1010 1110
left : 1011 1010 1011 1010

(Dans le cas où on ne sait pas, se déplace dans le LSB la position du MSB pour la droite rotation et vice-versa).

Mon processeur a déjà une rotation à droite (rrnC, CRR) et faites pivoter l'instruction gauche (rlnc, RLC), donc je suis en espérant que le compilateur d'optimiser cela dans. Dans le cas contraire, je pourrais avoir à utiliser l'assembleur en ligne.

Était-ce utile?

La solution

Vous pouvez les écrire combinaison évidente de changements conventionnels:

x rol N == x << N | x >> width-N
x ror N == x >> N | x << width-N

où est width nombre de bits en nombre vous faites pivoter.

compilateur intelligent peut (je pense que ce serait) détecter cette combinaison et compiler à l'instruction de rotation.

Notez que cela fonctionne pour non signé et si la largeur est égal au nombre de bits mot de la machine que vous traitez sur (16 pour unsigned int sur dsPIC).

Autres conseils

Il n'y a pas de décalage circulaire C. ( Référence )

assembleur en ligne est peut-être la voie à suivre, si la performance est critique. Sinon, vous pouvez utiliser le code dans l'article lié ci-dessus.

Il y a un GCC pour dsPIC? Regardez dans son manuel si elle a obtenu une valeur intrinsèque pour les quarts de cercle. L'autre option est asm en ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top