Как разбить неподписанный короткий на два - PullRequest
1 голос
/ 18 января 2011

Я пытаюсь проанализировать двоичные данные, которые я получаю в строке. Я не очень знаком с побитовой операцией.

Один байт (который я предполагаю, является беззнаковым коротким) в моей строке содержит 2 важных числа: версию и количество. Биты с 1 по 4 содержат версию, а с 5 по 8 - количество.

Итак, у меня есть unsigned short, содержащий данные, как мне получить два неподписанных шорт, содержащих 2 нужную мне информацию.

bit: 1_2_3_4_5_6_7_8_

con: VERSION_COUNT___

Ответы [ 4 ]

2 голосов
/ 18 января 2011

Сдвиньте и выполните операцию AND.

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

или наоборот. Биты в виде чисел справа налево - 7-6-5-4-3-2-1-0

1 голос
/ 18 января 2011

Я понимаю, что два фрагмента информации (версия и количество) хранятся в виде пары двух кусочков (4-битных фрагментов) в одном байте, поэтому я думаю, что вы подумали о типе unsigned char вместо unsigned short ( в этом случае вы бы разбили его на два байта). Если это правильно, у нас есть два случая упаковки клевов:

Случай 1: версия старшего куска (биты 4-7) и число младшего куска (биты 0-3)

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

Случай 2: счетчик - старший полубайт (биты 4-7), а версия - младший полубайт (биты 0-3)

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

где c - байт, содержащий информацию и объявленный как:

unsigned char c;

и битовая нумерация начинается с нуля для младшего значащего бита.

1 голос
/ 18 января 2011
unsigned short part1 = data & 0xF; // bits 0..3
unsigned short part2 = (data >> 4) & 0xF; // bits 4..7
0 голосов
/ 18 января 2011
unsigned short version = (unsigned short)(data & 0x0F);

unsigned short count = (unsigned short) (data >> 4);
...