Если вы пытаетесь найти расположение наиболее значимого бита, вы можете выполнить log2 () байта (а если у вас нет log2, вы можете использовать log (x) / log (2) что то же самое, что и log2 (x))
Например, числа 7, 6, 5 и 4 имеют «1» в позиции 3-го бита (0111, 0110, 0101, 0100). Log2 () из них все от 2 до 2,8. То же самое происходит со всем, что находится в 4-м бите, это будет число от 3 до 3,9. Таким образом, вы можете определить наиболее значимый бит, добавив 1 к log2 () числа (округлить в меньшую сторону).
floor(log2(00001111)) + 1 == floor(3.9) + 1 == 3 + 1 == 4
Вы знаете, сколько битов в байте, поэтому вы можете легко узнать количество бит, которое нужно сдвинуть влево:
int numToShift = 8 - floor(log2(bytearray[0])) + 1;
shiftedValue = bytearray[0] << numToShift;
Оттуда, это просто вопрос отслеживания того, сколько битов (еще не помещенных в массив байтов) у вас есть, а затем выдвинуть некоторые / все из них on.
Приведенный выше код будет работать только для первого байтового массива. Если вы поместите это в al oop, numToShift, возможно, потребуется отслеживать последний пустой слот для переноса вещей (возможно, вам придется сдвинуть вправо, чтобы соответствовать текущему массиву байтов, а затем использовать остатки для помещения в начало следующего байтового массива). Поэтому вместо того, чтобы делать «8 -» в приведенном выше коде, вы могли бы указать начальное местоположение. Например, если бы для заполнения текущего массива байтов осталось всего 3 бита, вы бы сделали:
int numToShift = 3 - floor(log2(bytearray[0])) + 1;
Таким образом, это число должно быть переменной:
int numToShift = bitsAvailableInCurrentByte - floor(log2(bytearray[0])) + 1;