1) Может кто-нибудь объяснить мне, как работает следующий код? символ а = 3; int x = a - '0';
Я обязуюсь сделать это, чтобы преобразовать символ в int, однако я не понимаю логику, стоящую за ним. Почему / Как это работает?
Конечно. переменная a имеет тип char и, заключив одинарные кавычки в 0, заставляет C также рассматривать его как char. Наконец, весь оператор автоматически типизируется по своему целочисленному эквиваленту, потому что x определяется как целое число.
2) Теперь, что касается битовых операторов, я чувствую себя действительно потерянным здесь.
--- Что делает этот код? if (~ pointer-> intX & (1 << i)) {c ++; n = i; } Я где-то читал, что ~ инвертирует биты, но я не вижу, что делает этот оператор и почему он это делает. </strong>
(~pointer->intX & (1 << i)) is saying:
отрицание intX и AND с 1 сдвинутым влево на i битов
Итак, что вы получаете, если intX = 1011 и i = 2, равно
(0100 & 0100)
-negate 1011 = 0100
-(1 << 2) = 0100
0100 & 0100 = 1 :)
тогда, если операция AND возвращает 1 (что, в моем примере, так и происходит)
{c ++; n = i; } * * Тысяча двадцать-один
Итак, увеличьте c на 1 и установите переменную n равной i
То же самое с этой строкой: row.data = ~ (1 << i); </strong>
Same principle here.
Shift a 1 to the left by i places, and negate.
So, if i = 2 again
(1 << 2) = 0100
~(0100) = 1011
** --- Другой вопрос:
if (x != a) { ret |= ROW; }
Что точно делает оператор | =? Из того, что я прочитал, | = ИЛИ, но я не совсем понимаю, что делает это утверждение. **
if (x! = A) (надеюсь, это очевидно для вас .... если переменная x не равна переменной a)
ret |= ROW;
equates to
ret = ret | ROW;
, что означает двоичное ИЛИ ret с ROW
Для примеров того, что именно выполняют операции И и ИЛИ, вы должны хорошо понимать бинарную логику.
Проверьте в википедии таблицы истинности ... т.е.
Битовые операции