2015-05-04 6 views
-1

У меня есть указатель на char, который указывает на 16 байт массива (поэтому 128 бит). Эти биты содержат некоторую ценную информацию для моей задачи, и мне нужно проанализировать значения из их фиксированных местоположений. Например, имеется информация о времени между 23-м и 12-м битами. Я знаю, что мне нужно иметь битмаску для извлечения таких данных, но я не мог этого сделать.Бит-маска для получения значения между битами X и Y

Может ли кто-нибудь сказать мне, как я могу получить эту информацию?

Наконец, мне нужно преобразовать эти извлеченные биты в целое число, но это уже легкая часть задачи.

+0

как насчет 'arr [1] && 0xF0' и 'arr [2] && 0xFE' и их объединение их? –

+0

C#? Qt? Пожалуйста, не помещайте теги спама – deviantfan

+0

Почему вы думаете, что это спам? На эту тему могут ответить люди из всех этих областей. – Dundar

ответ

2

Общий подход состоит в том, чтобы выбрать байт внутри квадратных скобок, а затем замаскировать биты, которые вам нужны, используя одиночный &, а затем вправо сдвинуть байт на количество бит, которое оно находится на lsb, тогда вы имеют целочисленное значение.

например.

int i = (int)((a[1] & 0x6) >> 1);

Это позволит получить значение 2-го и 3-го младших бит второго слова и поместить значение в целом числе.

Более конкретно для Вашего вопроса: двадцать третий бит и двенадцатый бит

int i = (int)((a[1] & 0xF0) >> 4) || (((int)(a[2])) << 8);

Другой подход в C/C++ будет определять упакованное-структуру с битовых полей.

+0

Не должно быть & 0x0F? потому что F0 означает 1111 0000, и я должен получить 0000 1111, который равен 0x0F? – Dundar

+1

'int i = ((int) a [1] <<29) >> 1;' на самом деле быстрее – user3528438

+0

вы не можете передать его в int, потому что вы не знаете, –

Смежные вопросы