Vrai décalage >> sur type signé arbitraire ?

Vrai décalage >> sur type signé arbitraire ? - C++ - Programmation

Marsh Posté le 27-07-2002 à 00:27:47    

J'ai un problème avec l'expression suivante:

Code :
  1. signed char var= -128;                                     //1000 0000 binaire
  2.                var >> shift ; //réplication du bit de signe: 1100 0000 binaire
  3. (unsigned char)var >> shift ; //insertion de 0             : 0100 0000 binaire

Si var est de type signé, le bit de poids fort est répliqué au décalage, ce que je ne souhaite pas.
Mais je ne peut pas utiliser de cast "unsigned" parceque le type est un paramètre de patron.
 
Comment faire ?
 
Accessoirement, quelqu'un sait-il écrire le code assembleur pour faire une rotation de bits sur une variable C ?
8,16,32 bits ou plus SVP.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 27-07-2002 à 00:27:47   

Reply

Marsh Posté le 27-07-2002 à 06:51:58    

en asm:
décalages signés:
sal,sar (gauche, droite)
 
non signés:
shl,shr (gauche,droite)
 
évidemment sal & shl sont équivalents....


Message édité par bjone le 27-07-2002 à 06:52:26
Reply

Marsh Posté le 27-07-2002 à 11:53:29    

tu récupère la valeur du bit de poid fort, tu le met à 0, tu décale et tu remet le bon bit à la valeur initiale


---------------
Le Tyran
Reply

Marsh Posté le 27-07-2002 à 13:41:29    

oui, chui trop con, t'as juste à faire:
 
dans le cas est c'est un 32bits:
 
l'idée:
 
(yo>>1)&0x7fffffff
 
(yo>>2)&0x3fffffff
 
(tu forces les bits inserés à 0)
 
 
 
 
 

Reply

Marsh Posté le 29-07-2002 à 02:43:29    

J'y avais bien pensé, mais je souhaite éviter de rajouter une instruction.
J'ai besoin d'un "sign_cast<unsigned>(var)" qui n'existe pas !
 

bjone a écrit a écrit :

en asm:
décalages signés:
sal,sar (gauche, droite)
 
non signés:
shl,shr (gauche,droite)
 
évidemment sal & shl sont équivalents....


Je sais pas me servir de l'assembleur.
Tu pourrais me mettre la syntaxe "telle quelle" STP:

Code :
  1. int var ; //ou char, short, __int64...
  2. __asm{
  3. ???
  4. }


Message édité par Musaran le 29-07-2002 à 02:54:10

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 05-08-2002 à 00:54:47    

Les fonctions de rotation pour entiers existent: lrotr et rotl.
rotr est définie comme suit (Visual Stufio 6):

Code :
  1. include: stdlib.h
  2. fichier: ROTR.C
  3. unsigned __cdecl _rotr (
  4.         unsigned val,
  5.         int shift
  6.         )
  7. {
  8.         register unsigned lobit;        /* non-zero means lo bit set */
  9.         register unsigned num = val;    /* number to rotate */
  10.         shift &= 0x1f;                  /* modulo 32 -- this will also make
  11.                                            negative shifts work */
  12.         while (shift--) {
  13.                 lobit = num & 1;        /* get high bit */
  14.                 num >>= 1;              /* shift right one bit */
  15.                 if (lobit)
  16.                         num |= 0x80000000;  /* set hi bit if lo bit was set */
  17.         }
  18.         return num;
  19. }

A ma grande surprise elle ne fait pas appel à l'instruction assembleur.
Elle utilises aussi un if évitable, ce qui est peu performant.
Mais c'est quoi ce mauvais code ?
 
Et sur d'autres compilateurs, c'est comment ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed