void getBin(int num, char *str)
getBin()
принимает ряд (num
) и строку для записи (str
)
*(str+16) = '\0';
Последний символ str
установлен в NULL терминатора
int mask = 0x8000 << 1;
Мы создаем переменную, называемую mask
, и установите ее на 0x8000, сдвинутую влево на 1, что равно 0x10000. Зачем?может быть легче видеть в двоичной системе:
0x8000 => 1000 0000 0000 0000 (а затем переместить все осталось 1 место) => 0x10000
while(mask >>= 1)
Хотя mask
больше 0, то сдвиг вправо 1 бит, и сохранить результат обратно в mask
. (>>=
означает сдвиг вправо и сохранение). Это означает, что значения будут:
0x10000 == 1 000 0000 0000 0000 == 65536
0x8000 == 1000 0000 0000 0000 = = 32768
0x4000 == 100 0000 0000 0000 == 16384
0x2000 == 10 0000 0000 0000 == 8192
...
0x4 == 100 == 4
0x2 == 10 == 2
0x1 == 1 == 1
Наконец, на каждой из этих итераций:
*str++ = !!(mask & num) + '0';
Этот код принимает каждую цифру в num
, AND'ing его с 1 бит, который установлен в mask
и проверяет, является ли результат == 0
, затем он добавляет значение символа 0
и сохраняет это окончательное число «ASCII» в строке, а затем увеличивает строку.
Давайте разберем, что вниз на один шаг за один раз:
mask & num // num is 3334 = 0011 0011 0011 0100
// mask starts at = 1000 0000 0000 0000
Итак, на первой итерации значение (mask & num)
является 0
.
!!(x)
такая же, как говорят: (x == 0 ? 0 : 1)
так на первой итерации мы имеем 0
так !!(0)
дает нам 0, мы хотим сохранить, что в нашу строку, но мы хотим, чтобы это было ASCII символов.ASCII символов для 0 является 0x30 поэтому мы добавляем 0x30 к 0 и получить 0x30 (или '0'
), то
*str++ = '0';
We разыменовать str
и хранить символ 0, то есть после приращения перехода к следующему символ в строке.
Также обратите внимание, что код сработает и сгорит на 8 или 16-разрядном компьютере, где int - 16 бит. – Lundin
Полезно знать. У кого-то есть лучший способ, если он работает на 16-битном микро, как MSP430? – cii