Возникли проблемы с пониманием того, как работает этот фрагмент кода «binaryString [i] = ((number

#c #binary #bitwise-operators

#c #двоичный #побитовые операторы

Вопрос:

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

 binaryString[i] = ((number amp; 1)   '0')
 

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

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

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

Комментарии:

1. Он сравнивает правильный бит с 1 и сохраняет значение в массиве. Затем он сдвигает биты числа вправо на 1 позицию для следующего прохождения через цикл.

Ответ №1:

Давайте binaryString[i] = ((number amp; 1) '0') разберем, по частям:

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

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

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

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

Комментарии:

1. о! В этом есть большой смысл. Спасибо 🙂

2. Почему '0' 1 yields '1' следует объяснить.

3. @EricPostpischil упс, опечатка с моей стороны. И добавил некоторые пояснения.

4. @AliceChen если это помогло вам, не стесняйтесь принять это как ответ.

5. Важное примечание: это работает только потому, что гарантируется, что символы для цифр '0' .. '9' находятся в последовательном диапазоне чисел. Для букв 'a' .. 'z' это не гарантируется. Между ними могут быть пробелы. (Но в большинстве реализаций пробелов нет)

Ответ №2:

Это (number amp; 1) вернет 1 для чисел, где самый правый бит равен единице, и 0 в противном случае. amp; 1 работает путем преобразования всех битов, кроме самого правого, в 0, потому что 1 — это как 00000001 в двоичном коде.

Итак

 XXXXXXXY
00000001 amp;
0000000?
 

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

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

Комментарии:

1. Спасибо! Теперь это имеет смысл.

2. В C '0' 1 выдает '1' результат, даже если ASCII не используется.