Чтобы отсортировать это в группы по 4, вам нужно поработать над клевом.Функция, которая печатает полубайт (значение от 0 до 15 декабря), может выглядеть следующим образом:
void print_bin_nibble (uint8_t ls_nibble)
{
for(size_t i=0; i<4; i++)
{
uint8_t bitmask = 1u << (4-1-i);
printf("%c", (ls_nibble & bitmask) ? '1' : '0');
}
printf(" ");
}
Теперь, если вы хотите распечатать данные по кусочкам, пропуская ведущие нули для полубайтов, равных 0000 bin,вам нужно отслеживать, следует ли пропустить печать с логическим флагом.Логика будет такой:
if(nibble==0 && remove_zeroes)
{
; // do nothing
}
else
{
remove_zeroes = false;
print_bin_nibble(nibble);
}
, которая может быть переписана как (законы де Моргана):
if(nibble != 0 || !remove_zeroes)
{
remove_zeroes = false;
print_bin_nibble(nibble);
}
Дальнейшее рассмотрение при печати числа - это постоянство ЦП.Существуют различные (плохие) способы, которыми мы можем перебирать целочисленный байт за байтом, например, используя арифметику указателей или объединения.Но тогда результат будет зависеть от порядка байтов и будет выглядеть странно на машинах с прямым порядком байтов.Используя сдвиги битов, мы полностью устраняем эту проблему переносимости, поскольку они не зависят от порядка байтов.
Например, для 32-битного целого числа u32 мы можем замаскировать отдельные байты следующим образом:
(u32 >> (24-n*8)) & 0xFF
где n
- номер байта от 0 до 3. В итоге мы сдвигаем 24 бита для n = 0, 16 бит для n = 1, 8 бит для n = 2 и 0 бит для n = 3.
Полный пример:
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
void print_bin_nibble (uint8_t ls_nibble)
{
for(size_t i=0; i<4; i++)
{
uint8_t bitmask = 1u << (4-1-i);
printf("%c", (ls_nibble & bitmask) ? '1' : '0');
}
printf(" ");
}
void print_bin32 (uint32_t u32)
{
bool remove_zeroes = true;
for(size_t i=0; i<sizeof(u32); i++)
{
uint8_t byte = (u32 >> (24-i*8)) & 0xFF;
uint8_t nibble;
nibble = (uint32_t)byte >> 4;
if(nibble != 0 || !remove_zeroes)
{
remove_zeroes = false;
print_bin_nibble(nibble);
}
nibble = byte & 0xF;
if(nibble != 0 || !remove_zeroes)
{
print_bin_nibble(nibble);
}
}
printf("\n");
}
int main (void)
{
print_bin32(16);
print_bin32(0xDEADBEEF);
print_bin32(0xABBA);
}
Вывод:
0001 0000
1101 1110 1010 1101 1011 1110 1110 1111
1010 1011 1011 1010