Пройдем через код, используя простой пример. Давайте установим для примера пример x = y = z = 10;
. Ваша единственная линия может быть разделена на несколько частей:
temp1 = z * y;
temp2 = temp1 + 31;
temp3 = temp2 & ~31;
temp4 = temp3/8;
a = temp4 * abs(x);
Здесь temp1
- temp4
также типа int
. Используя приведенный выше код и примеры значений, temp1
и temp2
просты для расчета:
temp1 = 10 * 10 = 100
temp2 = 100 + 31 = 131
Чтобы получить temp3
, мы должны знать двоичную temp2
, который в данном случае является 10000011
. Таким образом, мы получаем:
10000011
& 11100000
----------
10000000 = 128 in decimal
So temp3 = 128
. Отсюда, temp4
и a
тривиальны:
temp4 = 128/8 = 16
a = 16 * 10 = 160
Для дальнейшего использования, когда вы запутались, что делает строка кода, первый разбить его, как я сделал выше, а затем использовать отладчик (например, GDB) для выполнения кода. Это поможет сделать код понятным.
Почему вы думаете, что только самые младшие бит будут перевернуты, а не более высокие, 0-бит тоже? – Deduplicator
'&' побитовое "и". '&&' является короткозамкнутым логическим "и". Для получения дополнительной информации см. Любую достойную ссылку на С. –
Разделите в нем детали с временными переменными. Затем пропустите этот код в отладчике, шаг за шагом. Это позволит очень легко понять, что происходит. –