En C je dois mettre à l'échelle uint8_t
de 0 - 255 à 0 - 31Quelle est la meilleure façon de mettre à l'échelle un octet de façon uniforme?
Quelle est la meilleure façon de faire cela uniformément?
En C je dois mettre à l'échelle uint8_t
de 0 - 255 à 0 - 31Quelle est la meilleure façon de mettre à l'échelle un octet de façon uniforme?
Quelle est la meilleure façon de faire cela uniformément?
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.
Je pense que la valeur arrondie échouera si vous avez un original qui est au-dessus (255 - 15). – Laserallan
@Laserallan: Lol, j'ai remarqué ça aussi! (Je dois avoir été éditer pendant que vous faites le commentaire) –
Ne pas arrondir. Votre première réponse est la bonne, je pense. Il distribue également les résultats. –
Vous pouvez utiliser une simple multiplication et division:
uint8_t scaled = (uint8_t)(((uint32_t)original * 32U)/256U);
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. –
Touche vendeur. – user7116
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
Un uint8_t n'est pas 256 bits - il est 8 bits. Pourriez-vous donner plus d'informations? –
Que voulez-vous dire exactement par échelle? – Eddie
256 bits était totalement faux, question mise à jour, merci. –