Возникают проблемы с пониманием того, как работает этот фрагмент кода "binaryString [i] = ((number & 1) + '0')" - PullRequest
0 голосов
/ 18 апреля 2019

Это материал из слайда лекции, но я не могу понять, как этот раздел:

binaryString[i] = ((number & 1) + '0')

проверяет, равен ли каждый бит 1 / 0.

Вот и весь блок.

char *intToBinary(unsigned int number) { 
     char *binaryString = malloc(32+1); 
     int i;
     binaryString[32] = '\0';
     for (i = 31; i >= 0; i--) {
         binaryString[i] = ((number & 1) + '0');
         number = number >> 1;
     }
     return binaryString;
}

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Давай сломаем binaryString[i] = ((number & 1) + '0') вниз, по частям:

сначала посмотрим на (number & 1). Это проверяет, является ли младший значащий бит в number 1 или нет. Если это так, это выражение оценивается в 1, в противном случае оно оценивается в 0.

((number & 1) + '0') берет результат этого предыдущего вычисления и добавляет его к 0. Если наименее значащая цифра number равна 0, мы добавляем '0' и 0, получая '0'. В противном случае мы добавляем 1 и '0', получая '1'. Это работает, потому что в C символы являются числовым типом, поэтому вы можете добавить их; символ после '0' равен '1', поэтому добавление 1 к '0' дает '1'.

Затем мы сохраняем этот результат ('1' или '0') в нашей строке.

Наконец, мы сдвигаем number по порядку, избавляясь от части, на которую мы только что посмотрели: number = number >> 1;.

0 голосов
/ 18 апреля 2019

Это (number & 1) вернет 1 для чисел, где самый правый бит равен единице, и 0 в противном случае.& 1 работает с и все биты, кроме самого правого, равны 0, потому что 1 аналогично 00000001 в двоичном формате.

То есть

XXXXXXXY
00000001 &
0000000?

что равно 1, если Y равно 1 или 0, если Y равно 0.

После этого следует + '0'.Это подвох, но его легко понять, когда вы получите таблицу ASCII.Значения '0' - это 48 (десятичное число) в таблице ASCII, а '1' - это 49. Таким образом, ((number & 1) + '0') будет выглядеть примерно так: (0 + '0'), равный '0' или (1 + '0'), равный '1'.Короче говоря, именно здесь он заполняет binaryString единицами и нулями.

...