C: правильный способ обработки 24-битного номера дополнения 2 - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть выборочный набор 32-битных данных в формате 24-битный, дополнение 2, сначала MSB.Точность данных составляет 18 бит;неиспользуемые биты - это нули. Я хочу обработать числа в этом наборе образцов, чтобы найти их среднее значение.

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

Один из способов - сдвинуть по битам все числа из выборки, установленной вправо, на 14. Таким образом, я непосредственно получаю 18 полезных битов (поскольку это 24-битные данные с 18-битнымиточность, поэтому извлекаем только 18 полезных битов).Затем я могу напрямую использовать эти числа для расчета их среднего.

Ниже приведен пример выборки данных: -

  • 0xF9AFC000

  • 0xF9AFC000

  • 0xF9AE4000

  • 0xF9AE0000

  • 0xF9AE0000

  • 0xF9AD0000

  • 0xF9AC8000

  • 0xF9AC8000

  • 0xF9AC4000

  • 0xF9AB4000

  • 0xF9AB8000

  • 0xF9AB4000

  • 0xF9AA4000

  • 0xF9AA8000

  • 0xF9A98000

  • 0xF9A8C000

  • 0xF9A8C000

  • 0xF9A8C000

  • 0xF9A88000

  • 0xF9A84000

Тем не менее, 18-разрядное число по-прежнему имеет знаковый бит (MSB).Этот бит не всегда установлен и может быть 0 или 1. В зависимости от данных.

Должен ли я просто замаскировать знаковый бит, используя все числа с 0x1FFFF, и использовать их для вычисления среднего значения?

Или я должен сначала преобразовать их из дополнения 2 в целые числа, отрицая и добавив 1?

Пожалуйста, предложите правильный способ извлечь и обработать число " 24-бит, дополнение 2, MSB first "из 32-битного числа.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 декабря 2018

Что ж, предоставление образцов данных не является полной спецификацией, но давайте посмотрим на

F9AFC000

Похоже, что данные находятся в старших 3 байтах.Это предположение.Если это действительно 24 бита дополнения до 2, то получение истинного значения в 32-битном целом - это просто

int32_t get_value_from_datum(uint32_t datum) {
  return (int32_t) datum >> 8; 
}

. В примере это будет означать расширение старшего бита ведущего F.Результат будет FFF9AFC0.Как целое число дополнения 2, записанное в базе 10, это -413760.

Или, возможно, вы имеете в виду, что интересующие 18 бит полностью выровнены по левому краю в 32-битном слове.Тогда это

int32_t get_value_from_datum(uint32_t datum) {
  return (int32_t) datum >> 14; 
}

Это приводит к -6465.

Как я уже сказал в комментарии, вам нужно более четко объяснить формат данных.

Точная спецификациялегче всего показать в виде изображения 32-разрядного слова MSB to LSB, которое идентифицирует , из которых 18 битов являются битами данных .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...