Теперь, когда у нас есть все вместе, я могу показать вам решение. Однако я не буду объяснять код котельной пластины вокруг соответствующей части.
Поскольку ваш массив содержит все биты в последовательности, вы можете просто сдвинуть их один за другим в переменную назначения. Я назвал это value
. Он должен быть инициализирован на тот случай, если заданы не все биты.
#include <stdio.h>
int array[] = {
0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
void bin_array_to_hex(int *b, int length) {
if (length % 8) {
printf("Length must be dividable by eight!\n");
return;
}
unsigned int value = 0;
if (length / 8 > sizeof value) {
printf("Length must be <= %u!\n", 8 * (unsigned int)sizeof value);
return;
}
while (length--) {
value <<= 1;
if (*b) {
value |= 1;
}
b++;
}
printf("%08x\n", value);
}
int main(void) {
bin_array_to_hex(array, sizeof array / sizeof array[0]);
return 0;
}
Еще несколько замечаний:
- Нет необходимости в дополнительных локальных переменных. Параметры можно рассматривать как локальные переменные, на самом деле они обрабатываются очень похоже в обычных условиях. Поэтому мы можем использовать их (здесь:
b
и length
) напрямую. - Вам не нужен самодельный шестнадцатеричный принтер.
printf()
может сделать это для вас. Если вам нужен результат в строке, используйте sprintf()
.