2009-03-02 9 views

Répondre

12

Si vous essayez de passer de 8 bits à 5 bits, vous pouvez effectuer un décalage de 3 bits;

uint8_t scaled = (uint8_t)(original >> 3); 

Cela supprime les 3 bits inférieurs.

+0

Je pense que la valeur arrondie échouera si vous avez un original qui est au-dessus (255 - 15). – Laserallan

+0

@Laserallan: Lol, j'ai remarqué ça aussi! (Je dois avoir été éditer pendant que vous faites le commentaire) –

+0

Ne pas arrondir. Votre première réponse est la bonne, je pense. Il distribue également les résultats. –

1

Vous pouvez utiliser une simple multiplication et division:

uint8_t scaled = (uint8_t)(((uint32_t)original * 32U)/256U); 
+0

Je ne suis pas sûr, mais je souhaite convertir l'original en quelque chose de plus grand pour éviter la troncature due au débordement * 32. –

+0

Touche vendeur. – user7116

+0

FYI, Cette réponse est la même que scaled = (original << 5) >> 8, qui est la même que scale = original >> 3, qui est la même que la réponse acceptée.) – SoapBox

Questions connexes