2010-03-07 6 views
0

j'ai posé la question here et maintenant je voudrais inverser cette procédureC: Décompression d'un octet

J'ai un court non signé qui représente un motif de bits, je voudrais un tableau de bool [16] qui a vrai ou false défini pour le bit correspondant dans le short non signé.

jusqu'à présent j'ai

où 2 binaire est un court non signé, qui a le motif de bits je veux décompresser.

unsigned short i; 
i = 1<<(sizeof(unsigned short) * 8 - 1); 

while (i > 0) { 
    if (binary2 & i) 
     printf("1"); 
    else 
     printf("0"); 
    i >>= 1; 
} 

mais il me semble manquer le premier bit de mon motif et déplacer les autres.

+7

S'il vous plaît poster le code que vous avez écrit jusqu'à présent. Les gens n'aiment généralement pas écrire votre code pour vous. –

+1

je ne suis pas d'accord. Je réponds à toute question posée que je peux, je crois que SO est destiné à devenir la banque de réponses complète. l'endroit pour trouver toutes les réponses. Répondez à tous, ne jugez pas. –

+0

Le code que vous avez posté ne déballe pas. Il imprime la représentation binaire de 'binary2'. – kennytm

Répondre

2

que diriez-vous?

void ExtractBits(int pattern, int array[16]) 
{ 
    for (int ii = 0; ii < 16; ++ii) 
    { 
     array[ii] = pattern & 1; 
     pattern = pattern >> 1; 
    } 
} 
+0

agréable et simple. –

3
void get_bits(uint16_t pattern, bool bits[16]) { 
    for (int i = 0; i < 16; ++ i) 
     bits[i] = (pattern & 1 << i) != 0; 
} 

union bit16 { 
    uint16_t bit_pattern; 
    struct { 
     int bit0 : 1; 
     int bit1 : 1; 
     int bit2 : 1; 
     int bit3 : 1; 
     int bit4 : 1; 
     int bit5 : 1; 
     int bit6 : 1; 
     int bit7 : 1; 
     int bit8 : 1; 
     int bit9 : 1; 
     int bit10 : 1; 
     int bit11 : 1; 
     int bit12 : 1; 
     int bit13 : 1; 
     int bit14 : 1; 
     int bit15 : 1; 
    } bits; 
}; 
+1

Etes-vous sûr que le syndicat est ici portable? L'alignement de la structure peut être différent. –

+0

@Checkers: Il peut simplement déplacer le court jusqu'à la fin de l'union pour résoudre tous les problèmes d'alignement. –

+1

Vous devriez rendre vos champs de bits explicitement non signés; sinon ils pourraient finir comme des champs à un bit signés! –

0

Pas le meilleur morceau de code, mais il fait le travail. Vous savez rapidement & choses sales :)

typedef unsigned short int Word; 

bool get_bit(Word word, size_t pos) 
{ 
    return (word &= (1 << pos)); 
} 

void unpack_word(Word word, bool unpacked_bits[]) 
{ 
    for(size_t i = 0; i < sizeof(Word)*CHAR_BIT; ++i) 
     unpacked_bits[i] = get_bit(word, i); 
} 

int main() 
{ 
    Word w = 0xF0FF; 
    bool bits[sizeof(Word)*CHAR_BIT]; 
    unpack_word(w, bits); 
} 
+0

'std ::' n'est pas nécessaire. La question est sur C, pas C++. (et oui, 'bool' existe aussi en C (' stdbool.h').) – kennytm

+0

@KennyTM Merci, j'ai oublié que la question concerne C seulement :) – AraK

0

Je ne comprends pas pourquoi vous voulez faire cela parce que ça sonne comme il est lent, mais le code pour le faire, il devrait être assez simple. Laissez-moi d'abord vérifier que je comprends ce que vous essayez de faire. Vous avez un short non signé et un tableau de bools. Vous voulez extraire chaque bit dans le court dans un bool. Correct? Si ce qui devrait être ce que vous cherchez:

unsigned short bitmask = (some mask); 
bool bools[sizeof(unsigned short) * 8]; 
for(unsigned short i = 0; i < sizeof(unsigned short) * 8; ++i) 
{ 
    unsigned short bit = 1 << i; 
    bools[i] = bitmask & bit; 
} 

Selon ce que votre demande est en train de faire, je suggère fortement à l'aide énumérations pour chaque bit, et au lieu d'utiliser les bools faire juste l'opération contre et bitwise l'énumération pour obtenir la valeur du bit. Vous devez être prudent en utilisant des opérations au niveau du bit, car ils peuvent être très lents sur le processeur.

Aussi, je suggère fortement de ne pas utiliser les champs de bits que Kenny a montré dans une partie de sa réponse parce que je n'ai jamais travaillé sur un processeur où les champs de bits ne sont pas incroyablement lents.

0

Vous avez donc besoin de quelque chose comme ça;

for(i = 1, j = 0; i != 0x10000; i <<= 1, ++j) 
    result[j] = (binary2 & i) > 0; 

Par exemple:

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

bool result[16]; 

void try(unsigned short binary2) { 
    int i,j; 

    for(i = 1, j = 0; i != 0x10000; i <<= 1, ++j) 
    result[j] = (binary2 & i) > 0; 
} 

int main(int ac, char **av) { 
    int i; 

    if (ac > 1) 
    try(atoi(av[1])); 
    for(i = 15; i >= 0; --i) 
    printf("%c", result[i]["ft"]); 
    printf("\n"); 
    return 0; 
}