2011-01-18 4 views
1

J'essaie d'analyser les données binaires que je reçois dans une chaîne. Je ne suis pas très familier avec l'opération au niveau du bit.Comment diviser un court non signé en deux

Un des octets (que je suppose être un short non signé) dans ma chaîne contient 2 nombres importants: la version et un nombre. Les bits 1 à 4 contiennent la version, les bits 5 à 8 contiennent le nombre.

Donc, j'ai un unsigned short contenant les données, comment puis-je obtenir deux courts non signés contenant les 2 informations dont j'ai besoin.

bit: 1_2_3_4_5_6_7_8_

con: VERSION_COUNT___

+0

Devrait-il être «bits 5 à 8 contient le compte»? – Thomson

+1

les shorts non signés sont habituellement de 16 bits, et sont au moins aussi nombreux, bien qu'ils puissent être plus longs qu'ils ne sont pas plus grands que int. – CashCow

Répondre

2

Shift et effectuer une opération ET.

int version = value & 0xF; 
int count = (value >> 4) & 0xF; 

ou vice versa. Les bits que les numéros sont de droite à gauche - 7-6-5-4-3-2-1-0

+2

Il n'y a pas un moyen universel de numéroter les bits http://en.wikipedia.org/wiki/Bit_numbering –

+0

Il existe en C, et il est hérité en C++. Les opérateurs '>>' et '<<' le rendent visuellement clair. '1 << 3' est 1 décalé sur 3 positions. Puisque '1 << 3 == 8', nous savons que les bits sont comptés à partir de la gauche. De même, '128 >> ​​3 == 16'. – MSalters

+1

@MSalters Les opérateurs de décalage ne définissent pas comment les bits sont numérotés, et C ne fournit aucun moyen de faire référence à un bit spécifique par numéro. Ainsi, bien que nous sachions que la représentation binaire de 1 est 00000001 et 8 est 00001000, rien dans C ne spécifie si le bit défini dans 00000001 est appelé "bit 0", "bit 7" ou même "bit 8". La numérotation des bits est généralement un problème de documentation, pas de code: il n'y a pas beaucoup d'architectures adressables par bit, et (comme le dit l'article wikipedia) "La numérotation des bits est généralement transparente pour le logiciel". –

1
unsigned short part1 = data & 0xF; // bits 0..3 
unsigned short part2 = (data >> 4) & 0xF; // bits 4..7 
1

Je comprends que deux éléments d'information (version et le nombre) sont stockés comme une paire de deux amuse-gueules (Morceaux de 4 bits) dans un seul octet, donc je pense que vous pensiez au type unsigned char au lieu de unsigned short (auquel cas vous le diviser en deux octets). Si cela est vrai, nous avons deux cas de la façon dont des amuse-gueules sont emballés:

Cas 1: version est plus élevée (grignotage bits 4-7) et le nombre est inférieur (grignotage Bits 0-3)

unsigned char ver = c >> 4; 
unsigned char count = (c & 0x0f); 

cas 2: comptage est supérieur à grignoter (bits 4-7) et la version est quartet inférieur (bits 0-3)

unsigned char count = c >> 4; 
unsigned char ver = (c & 0x0f); 

où c est l'octet contenant des informations et est déclarée comme:

unsigned char c; 

et la numérotation des bits commence à zéro pour le bit le moins significatif.

0
unsigned short version = (unsigned short)(data & 0x0F); 

unsigned short count = (unsigned short) (data >> 4); 
Questions connexes