Когда вы говорите «быстрее» ... как часто выполняется этот код? 5 раз <<8
плюс |
, вероятно, стоит меньше 100 нс. Таким образом, если этот код выполняется 10 000 раз, это добавляет до 1 (одной) секунды.
Если код выполняется меньше раз и вам требуется более 1 секунды для реализации решения с чистым порядком байтов, вы теряете время каждого.
Тем не менее, решение для определения порядка байтов просто:
int a = 1;
char * ptr = (char*)&a;
bool littleEndian = *ptr == 1;
Теперь все, что вам нужно, это машина с прямым порядком байтов и пара тестовых случаев, чтобы убедиться, что ваше решение memcpy
работает. Обратите внимание, что вам нужно вызвать memcpy
пять раз в одном из двух случаев, чтобы изменить порядок байтов.
Или вы могли бы просто сдвинуться или пять раз ...
РЕДАКТИРОВАТЬ Полагаю, я немного неправильно понял ваш вопрос. Вы говорите, что хотите использовать младшие 5 байтов (= 40 бит) uint64_t
в качестве счетчика, да?
Таким образом, операция будет выполняться много, много раз. Опять же, memcpy
совершенно бесполезен. Давайте возьмем число 0x12345678
(32 бита). В памяти это выглядит так:
0x12 0x34 0x56 0x78 big endian
0x78 0x56 0x34 0x12 little endian
Как видите, байты меняются местами. Таким образом, для преобразования между ними вы должны либо использовать сдвиг битов, либо замену байтов. memcpy
не работает.
Но на самом деле это не имеет значения, так как процессор сделает декодирование за вас. Все, что вам нужно сделать, это сдвинуть биты в нужном месте.
key = item & 0x1FFFFF
count = (item >>> 21)
читать и
item = count << 21 | key
написать. Теперь вам просто нужно собрать ключ из пяти байтов, и все готово:
key = (((hash[0] << 8) | (hash[1]<<8)) | ....
РЕДАКТИРОВАТЬ 2
Кажется, у вас есть массив из 40-битных целых, и вы хотите читать / записывать этот массив.
У меня есть два решения: использование memcpy
должно работать до тех пор, пока данные не копируются между процессорами с разным порядком байтов (читай: когда вы сохраняете / загружаете данные на / с диска). Но вызов функции может быть слишком медленным для такого огромного массива.
Другое решение заключается в использовании двух массивов:
int lower[];
unit8_t upper[]
, то есть: Сохранить биты 33-40 в массиве second . Для чтения / записи значений требуется одна смена + or
.