lsb4 - shift vs mask ?

lsb4 - shift vs mask ?

by Sophie Sarah Ammann -
Number of replies: 2

Bonjour, 

Mon code initial pour lsb4 utilisait un shift : 

`uint8_t lsb4(uint8_t value) {

    return (value << 4) >> 4;

}`

Mais cette version ne fonctionne pas, alors que masquer value avec `0x0f` fonctionne.

Je ne comprends pas  pourquoi ma première version ne fonctionne pas, car uint8_t est un unsigned char (8 bits). 

In reply to Sophie Sarah Ammann

Re: lsb4 - shift vs mask ?

by Antoine Brunner -

Bonjour,

Votre première version ne marche pas à cause des promotions implicites de types. Par défaut, si une valeur peut être convertie sans perte de précision en un int (resp. unsigned int), alors elle est promue à ce nouveau type.

Dans votre cas, cela signifie que la valeur (value << 4) va être implicitement promue en un unsigned int, ce qui cause le comportement non voulu. Il vous faut donc explicitement caster le résultat du premier shift en un uint8_t pour que ça marche.

Ceci dit, utiliser un masque est plus facile et utilise une instruction de moins...

Bonne soirée !