Чтобы разбить число на полубайты, число сдвигов должно быть кратно 4. В противном случае извлекаются кусочки из 4 битов, которые не выстраиваются в линию.
00010101 (21)
^^^^ first nibble
^^^^ second nibble
Второй полубайт смещается на 4 битапоэтому его нужно сдвинуть вправо на 4, а не на 1.
Вы можете умножить число сдвигов на 4, но есть более простой способ: только когда-нибудь сдвиг на 4. Например:
for (int i = len - 1; i >= 0; i--) {
num[i] = toSet & 0xF;
toSet >>= 4;
}
Затем каждая итерация извлекает наименьший клев в toSet
и сдвигается на toSet
, так что следующий клев становится наименьшим.Я не вставил break
, и не должно быть ни одного.Это определенно не должен быть тип break
, который у вас был, что останавливает цикл также всякий раз, когда число имеет ноль в середине его (например, в 0x101 середина 0 вызывает остановку цикла).Цикл также не должен останавливаться, когда вся остальная часть числа равна нулю, так как это оставляет ненужные значения в других записях num
.
Чаще всего хранится самый низкий клев в 0-м элементе и т. Д.(тогда вам не нужно иметь дело со всей «обратной логикой» с обратными циклами и вычитанием значений из длины), но это ваше дело.
Извлечение значения может быть выполнено симметрично, построениерезультат, сдвигая его, вместо того, чтобы немедленно сдвигать каждую часть на свое конечное место.Или просто умножьте (len1-counter)
на 4. При извлечении значения вы также не сможете остановиться, если num[i]
равно нулю, поскольку это не доказывает, что остальная часть числа также равна нулю.