Эффективное преобразование массива 24-битных целых чисел в числа с плавающей запятой или двойные значения в C#C#

Место общения программистов C#
Anonymous
Эффективное преобразование массива 24-битных целых чисел в числа с плавающей запятой или двойные значения в C#

Сообщение Anonymous »

У меня есть массив чередующихся знаковых 24-битных целых чисел (комплексных чисел) с прямым порядком байтов, который я хотел бы преобразовать в комплексный массив чисел с плавающей запятой или двойных чисел. Под чередованием я имею в виду:

R1 R2 R3 I1 I2 I3 R4 R5 R6 I4 I5 I6 . . .


Где каждый элемент представляет собой 8-битный байт, а все три вместе представляют собой 24-битное целое число, где R = вещественное, а I = мнимое.

Какой наиболее эффективный способ сделать это в C#? Код должен выполняться много раз, поэтому я пытаюсь выжать из него каждый цикл, какой только могу. Я надеюсь на что-то более эффективное, чем грубый сдвиг или и приведение.

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

Вот базовый метод грубой силы с закомментированным вторым числом пары и игнорируемой на данный момент обработкой знаков, чтобы упростить IDL:

class Program
{
const int Size = 10000000;
static void Main(string[] args)
{
//
// Array of little-endian 24-bit complex ints
// (least significant byte first)
//
byte[] buf = new byte[3 * 2 * Size];
float[] real = new float[Size];
//float[] imag = new float[Size];

//
// The brute-force way
//
int j = 0;
Stopwatch timer = new Stopwatch();
timer.Start();
for (int i = 0; i < Size; i++)
{
real = (float)(buf[j] | (buf[j + 1]

Вернуться в «C#»