Une solution qui utilise toujours 5 bits pourrait être
new_value = ((data & 0x002) >> 1) |
((data & 0x008) >> 2) |
((data & 0x020) >> 3) |
((data & 0x080) >> 4) |
((data & 0x200) >> 5);
Mais une autre solution ici qu'au lieu d'utiliser un nombre fixe de bits (à savoir 5 dans votre cas) utilise une fonction qui vous permet de spécifier le nombre de bits à conserver.
Il pourrait être quelque chose comme:
#include <stdio.h>
#include <stdlib.h>
unsigned keepOddBits(const unsigned data, const unsigned number_of_bits_to_keep)
{
unsigned new_value = 0;
unsigned mask = 0x2;
int i;
for (i=0; i < number_of_bits_to_keep; ++i)
{
if (mask & data)
{
new_value = new_value | ((mask & data) >> (i + 1));
}
mask = mask << 2;
}
return new_value;
}
int main()
{
printf("data 0x%x becomes 0x%x\n", 0x3ff, keepOddBits(0x3ff, 5));
printf("data 0x%x becomes 0x%x\n", 0x2aa, keepOddBits(0x2aa, 5));
printf("data 0x%x becomes 0x%x\n", 0x155, keepOddBits(0x155, 5));
return 0;
}
sera sortie:
data 0x3ff becomes 0x1f
data 0x2aa becomes 0x1f
data 0x155 becomes 0x0
Changement main
pour demander 3 au lieu de 5 bits, comme:
int main()
{
printf("data 0x%x becomes 0x%x\n", 0x3ff, keepOddBits(0x3ff, 3));
printf("data 0x%x becomes 0x%x\n", 0x2aa, keepOddBits(0x2aa, 3));
printf("data 0x%x becomes 0x%x\n", 0x155, keepOddBits(0x155, 3));
return 0;
}
sera sortie:
data 0x3ff becomes 0x7
data 0x2aa becomes 0x7
data 0x155 becomes 0x0
en fait c'est le * complément * d'un masque habituel - un masque dirait quels bits garder. –
https://stackoverflow.com/questions/10493411/what-is- bit-masking –
@ tilz0R Il ne s'agit pas d'un doublon, car OP souhaite supprimer les bits, pas simplement les effacer. Certains changements devront se produire. – dasblinkenlight