Memcpy () — как функция для битовых векторов?

У меня есть вектор битов, и я хочу скопировать его фрагмент в другой вектор (скажем, для простоты, в начало другого вектора). Обратите внимание, что все биты, возможно, должны быть смещены (или, скорее, повернуты) в некотором направлении, а не только в первом элементе, поскольку выравнивание битов в каждом байте изменяется.

Предположим для ясности, что подпись:

void *memcpy_bits(
char* destination,
char* source,
size_t offset_into_source_in_bits,
size_t num_bits_to_copy);

И эти данные хранятся в байтах, поэтому не возникает проблем с порядком байтов, и младшие биты идут первыми в векторе. Мы могли бы сделать подпись более сложной, чтобы приспособиться к другим предположениям, но пока не обращайте на это внимания.

Так,

  • Есть ли какая-либо аппаратная поддержка для этого (я имею в виду процессоры x86 или x86_64)?
  • Существует ли какая-то стандартная / идиоматическая / широко используемая реализация этой функции (или что-то похожее)?

0

Решение

Сначала вы должны определить, как хранятся данные. Хранится ли он в массиве uint8_t, uint16_t, uint32_t или uint64_t? Бит # 0 хранится как значение 1u << 0? Вы, вероятно, не должны использовать void *, а базовый тип, который используется для хранения данных.

Во-вторых, вы можете предположить, что offset_into_source_in_bits меньше, чем число бит в базовом типе данных (если это не так, что бы вы сделали?)

В-третьих, если это смещение равно 0, вы можете просто вызвать memcpy. Это важно сделать, потому что следующий код не будет работать, если смещение равно 0.

В-четвертых, до тех пор, пока num_bits_to_copy> = количество бит в базовом типе, вы можете вычислить следующую единицу для сохранения в месте назначения, используя две смены.

В-пятых, если 0 < num_bits_to_copy < количество битов в базовом типе, то вам нужно быть осторожным, чтобы не прочитать какие-либо исходные биты, которые на самом деле не существуют.

Вы, вероятно, захотите быть осторожными, чтобы не перезаписывать какие-либо биты, которые вы не должны перезаписывать, и лично у меня также будет смещение в целевые биты, чтобы вы могли копировать произвольные диапазоны битов. Я мог бы также реализовать функцию memmove_bits.

1

Другие решения