#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 не используется.