2017-02-13 2 views
1

J'ai un octet, dont la valeur en binaire est 11111111. Je dois étendre mon octet à 16 bits 0101010101010101 selon ces règles: si bit = 1, maintenant 01. Si bit = 0, est maintenant 10.Comment est-ce que je peux masquer des bits?

Par exemple:

00001111 -> 1010101001010101 
00000101 -> 1010101010011001 

Quelle est l'opération pour le faire?

+0

Pourquoi masquez-vous un octet avec un masque 16 bits? Avez-vous l'intention de transformer votre entité en octets en un mot de 16 bits? –

+0

Vous réalisez un octet (généralement, maintenant jours) a seulement 8 bits à droite. Comment envisagez-vous de faire croître vos octets? –

Répondre

0

Je ne pense pas qu'il y ait un opérateur pour "expansion" bits comme décrit. Mais vous pouvez le faire dans une boucle avec décalage et tester les bits comme suit:

unsigned char b = 0xff; 
unsigned int result = 0x0; 

for (int i=0; i<8; i++) { 
    result <<= 2; // make place for the next 2 bits 

    int isSet = b & 0x80; // check highest significant bit of b 
    if (isSet) { 
     result |= 0x01; // in bits: 01 
    } 
    else { 
     result |= 0x02; // in bits: 10 
    } 

    b <<= 1; 
} 

Hope it helps.

+0

C'est tout! Merci –

+0

De rien. S'il vous plaît n'oubliez pas la réponse si elle a résolu votre problème ... –

1

d'abord, convertir votre octet à un int:

int x = (int)byte_value; 

Ensuite, étendent à 16 bits, en décalant les bits 4 à la fois, puis 2, puis 1, puis en doublant chaque bit avec un décalage et au niveau du bit OR:

x = ((x << 4) | x) & 0b0000111100001111; 
x = ((x << 2) | x) & 0b0011001100110011; 
x = ((x << 1) | x) & 0b0101010101010101; 
x = (x << 1) | x; 

Ensuite, masquer les bits de sorte que les positions paires bits sont 1 si le bit est égal à 1, et les positions impaires sont 1 si le bit est égal à 0 (en utilisant au niveau du bit NOT):

x = (x & 0b0101010101010101) | (~x & 0b1010101010101010); 
+0

Méfiez-vous: si jamais la valeur byte_value est signée char, alors la conversion en int effectuera une extension de signe et pourrait peupler tout sauf 8 bits avec 1. –