2017-08-18 4 views
2

Je voudrais savoir comment supprimer des bits dans une valeur de bit. Je reçois une valeur de 10 bits (bit 0 à bit 9) et je dois envoyer une variable qui ignore le bit 0, bit 2, bit 4 et bit 6 de la valeur reçue alors ma variable sera: bit 987531. Comment puis-je faire ? J'ai entendu parler bit de masque, je ne sais pas vraiment comment l'utiliser même si je sais que le masque serait 0x55Comment ignorer des bits dans une variable

Merci de me aider

+0

en fait c'est le * complément * d'un masque habituel - un masque dirait quels bits garder. –

+0

https://stackoverflow.com/questions/10493411/what-is- bit-masking –

+0

@ 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

Répondre

2

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 
+0

@ user8451061 J'ai remarqué que vous venez d'accepter ma réponse. J'étais sur le point de le supprimer parce que je pensais que c'était faux. Ma réponse ** seulement ** conserve ** le bit ** impair **. Après avoir lu votre question une fois de plus, il semble que vous vouliez conserver le numéro 8 (?). Mon code ** ne conserve pas ** le bit numéro 8. Êtes-vous sûr que c'est la réponse que vous voulez accepter? – 4386427

3

Créer des bits ensemble manuellement comme ci-dessous:

//Option 1 
uint8_t result = 0; 
result |= (inputValue >> 1) & 1; 
result |= ((inputValue >> 3) & 1) << 1; 
result |= ((inputValue >> 5) & 1) << 2; 
result |= ((inputValue >> 7) & 1) << 3; 
result |= ((inputValue >> 8) & 1) << 4; 
result |= ((inputValue >> 9) & 1) << 5; 
3

I Smell intégré :) Je ne promets pas la portabilité (mais pour la plupart des compilateurs Je sais, il le fera)

union 
{ 
    struct 
    { 
     unsigned b0 : 1; 
     unsigned b1 : 1; 
     unsigned b2 : 1; 
     unsigned b3 : 1; 
     unsigned b4 : 1; 
     unsigned b5 : 1; 
     unsigned b6 : 1; 

     unsigned bx : 3; 
    } 
    uint16_t raw; 
}raw; 

    raw.raw = value; 

    uint8_t without_skipped = raw.b1 | (raw.b3 << 1) | (raw.b5 << 2) | (raw.bx << 3) ; 

c'est pour little endian

Pour big endian inverser la struct et bitfild sans nom Padd