2012-02-22 2 views
0

Есть ли какой-либо изящный способ загрузить 16 8-битных данных и объединить их в 4 unsigned int?Как загрузить 16 8-битных данных и объединить их в 4 unsigned int?

нравится следующим образом:

нагрузки следующий массив (16 epi8) путем _mm_load_si128() к __m128i

0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xdd, 0xEE, 0xff

, а затем сделать некоторые манипуляции, такие, что регистр (__ m128i) становится 4 epi32,

0x33221100, 0x77665544, 0xbbaa8899, 0xffeeddcc

спасибо!

+0

Как данные заложены в памяти? –

+0

Вопрос одновременно указывает на то, что эти 16 байтов не будут последовательно упакованы и что они есть. Что он? – harold

+1

Вот как я интерпретирую ваш вопрос: у вас есть эти байты, хранящиеся в памяти, с 0x00 в первом байте, 0x11 во втором и так далее. Теперь вы хотите, чтобы они были сохранены в виде 32-разрядных маленьких конечных чисел (исходная конфигурация была бы большой endian). Просто поменяйте местами 0 и 3, позиции 1 и 2, позиции 4 и 7, позиции 5 и 6 и т. Д. Вам нужен список примеров? –

ответ

1

Да: ничего не делать. После загрузки регистр уже находится в вашем желаемом состоянии. (Предположим, что 0xbbaa8899 - опечатка, а вы на самом деле означали 0xbbaa9988, во всяком случае).

+0

Извините, я думаю, что не понял. Я имею в виду склеить 4 байта в 1 int параллельно. – prgbenz

+0

@prgbenz: Верно. Вам не нужно ничего делать. Вся необходимая информация уже находится в нужных местах; вам просто нужно интерпретировать его как 4 32-битных целых числа (что требует сдвига в вашей точке зрения, но никаких изменений в данных и, следовательно, фактических операций). –

+0

Я могу это подтвердить. Это одно из преимуществ маленького эндиана. – hirschhornsalz

0

Просто создайте 4 указателя int и сохраните свой m128 в последовательной памяти, на которые нацелены эти указатели.

Или у вас есть массив int [4] и сохраните ваш m128 в памяти, где находится массив, тогда массив [0..3] - ваши целые числа.

Или, если у вас уже есть массив 16 байт просто отбрасывать память целыми числами с индексами 0, 4, 8, 12.