Если у меня есть массив байтов, как скопировать биты смещения в новый массив байтов? - PullRequest
0 голосов
/ 13 февраля 2019

Если у меня есть массив байтов, каков наилучший способ скопировать биты в новый массив байтов?

Я делаю кодирование Голомба для кодирования серии 0 с разреженными единицами.В коде Голомба частное кодируется с остатком, так что вы можете вычислить число 0 с меньшим количеством битов, чем требуется в среднем в двоичном виде.Результирующий код является частным, остаток, некоторые нули для представления количества единиц, другой фактор, остаток, некоторые нули для представления единиц и т. Д.

Когда я обновляю этот код Голомба, все после остатка может оставаться прежним,Поэтому я хотел бы скопировать данные эффективным способом.Должен ли я использовать побитовые операторы или memcopy?

uint8_t *bytes; 
uint16_t length; // how many bits are needed for a given code

uint8_t *bytes = new uint8_t[length];
for (size_t i = 0; i < length; i++) {
    *(bytes + i) = ...; // set bits with some bitwise operators
}

Допустим, мне нужно обновить 5-й бит байта [2].Все после 6-го бита вплоть до байтов [длины] может оставаться неизменным.Однако в результате этого изменения 6-й бит байта [2] должен стать началом байта [3], эффективно сдвигая каждый байт на 2 точки вправо.

Лучше ли memcpyот 6-го бита [2] до байта [длины] и затем побитового действия на последних 2-х битах?Или переберите байты и используйте побитовые операторы (которые могут запутаться, поскольку мы начинаем с 6-го бита).Или можно «сдвинуть адрес» указателей на пару битов?(Не уверен, что последнее предложение имеет смысл, но в моей голове данные верны, поэтому не уверен, почему я не могу просто переместить «начальную точку» в другое место)

...