Помогите построчно разобрать код - C (СИ)
Формулировка задачи:
Помогите построчно разобрать код второй части.
#include <stdio.h>
#include <conio.h>
void dv(unsigned);
int main(int argc, char **argv)
{
unsigned x;
printf("Vvedite chislo > ");
scanf("%d", &x);
dv(x);
getch();
return 0;
}
void dv(unsigned x)
{
unsigned mask = 1, i;
mask <<= sizeof(unsigned) * 8 - 1;
for(i = 1; i <= sizeof(unsigned) * 8; i++)
{
printf("%c", x & mask ? '1' : '0');
x <<= 1;
if(!(i % 8))
printf(" ");
}
printf("\n");
}Решение задачи: «Помогите построчно разобрать код»
textual
Листинг программы
void dv(unsigned x)
{
unsigned mask = 1, i;
mask <<= sizeof(unsigned) * 8 - 1; // сдвиг mask на sizeof(unsigned) * 8 - 1 розрядов влево. Операция sizeof(чего-то) вычисляет размер в байтах чего-то
for(i = 1; i <= sizeof(unsigned) * 8; i++) // цикл, который работает, пока i<=16 (unsigned - 2 байта)
{
printf("%c", x & mask ? '1' : '0'); // после запятой тернарная операция (побитовое И), результат которой присваивается в %с
x <<= 1; // сдвиг х на 1 розряд влево
if(!(i % 8)) // если не true, выполняется принтф ниже. i%8 выдаст результат 0, если i нацело поделится на 8. ! - отменяет результат в скобках
printf(" ");
}
printf("\n");
}
Объяснение кода листинга программы
- Объявлены две переменные:
maskиi. Значениеmaskравно 1, аiинициализируется как 1. maskсдвигается влево наsizeof(unsigned) * 8 - 1позиций.- Запускается цикл от 1 до
sizeof(unsigned) * 8. - В каждой итерации выполняется побитовое И между
xиmask, результат которого затем преобразуется в символ и выводится на экран. - Значение
xсдвигается влево на 1 позицию. - Если текущая итерация делится на 8 без остатка (т.е.
i % 8 == 0), то выводится пробел. - После завершения цикла выводится символ новой строки. Список:
- Объявлены две переменные:
maskиi. Значениеmaskравно 1, аiинициализируется как 1. maskсдвигается влево наsizeof(unsigned) * 8 - 1позиций.- Запускается цикл от 1 до
sizeof(unsigned) * 8. - В каждой итерации выполняется побитовое И между
xиmask, результат которого затем преобразуется в символ и выводится на экран. - Значение
xсдвигается влево на 1 позицию. - Если текущая итерация делится на 8 без остатка (т.е.
i % 8 == 0), то выводится пробел. - После завершения цикла выводится символ новой строки.