Код печатает двоичное представление x
Эта строка
for (int i = (sizeof(int) * 8) - 1; i >= 0; i--)
делает i
имеющими значения от "number_of_bits_in_an_int" - 1 и вплоть до 0.
Итак, если мы предположим, что размер int равен 4 (символам), код можно записать так:
for (int i = 31; i >= 0; i--)
Так что в этом случае цикл может быть расширен как:
putchar(x & (1u << 31) ? '1' : '0');
putchar(x & (1u << 30) ? '1' : '0');
putchar(x & (1u << 29) ? '1' : '0');
...
putchar(x & (1u << 1) ? '1' : '0');
putchar(x & (1u << 0) ? '1' : '0');
Затем можно вычислить часть (1u << ..)
. 1u
- это целое число без знака со значением 1, которое сдвигается влево несколько раз. Он генерирует шаговый 1-битный паттерн, начиная с MSB. Например:
1000.0000.0000.0000.0000.0000.0000.0000 (i.e. 1u << 31)
0100.0000.0000.0000.0000.0000.0000.0000 (i.e. 1u << 30)
0010.0000.0000.0000.0000.0000.0000.0000 (i.e. 1u << 29)
...
0000.0000.0000.0000.0000.0000.0000.0010 (i.e. 1u << 1)
0000.0000.0000.0000.0000.0000.0000.0001 (i.e. 1u << 0)
Когда этот шаблон является побитовым и имеет значение x
с использованием &
, а результат используется как логическое значение, он будет генерировать true, когда соответствующий бит в x
равен 1(и false, если оно равно нулю).
Таким образом, код может быть записан в виде этого псевдокода:
putchar(is_bit_31_in_x_set ? '1' : '0');
putchar(is_bit_30_in_x_set ? '1' : '0');
putchar(is_bit_29_in_x_set ? '1' : '0');
...
putchar(is_bit_1_in_x_set ? '1' : '0');
putchar(is_bit_0_in_x_set ? '1' : '0');
Если sizeof не равен 4 (как предполагалось выше),Код по-прежнему печатает двоичное представление - просто с другим количеством битов. Например, с sizeof int равным 2, цикл будет идти от 15 до 0.