Если у меня есть массив байтов, каков наилучший способ скопировать биты в новый массив байтов?
Я делаю кодирование Голомба для кодирования серии 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-го бита).Или можно «сдвинуть адрес» указателей на пару битов?(Не уверен, что последнее предложение имеет смысл, но в моей голове данные верны, поэтому не уверен, почему я не могу просто переместить «начальную точку» в другое место)