Смешно, если условие в C

Я пытаюсь понять некоторый код C / C ++, который был написан быстро и грязно как 6-10 лет назад.

Что означает это выражение if?

int s_adr, e_adr, empf_adr;
// ...

if (success == OK &&
(s_adr & 0x1f) == empf_adr &&
(e_adr & 0x20) &&
(s_adr & 0x20)
)

Является (e_adr & 0x20) такой же как ((e_adr & 0x20) == 1) ? Или как мне это понять? Наверное, это глупый вопрос, когда вы очень хорошо знаете C и C ++. Но я не

2

Решение

& это немного операция, где как && это логическая операция.

Например, следующее очевидно;

if (a && b) ...

Тем не менее, следующее не является:

int a=1;
int b=2;
if (a & b) ...
if (a && b) ...

Эти две проверки дают разные результаты. Булевы операции в C предполагают false является 0 а также true это что-то кроме 0, Таким образом, логическая операция && в приведенном выше коде приведет к true,

Битовая операция &, однако делает побитовое И двух параметров. 1 в двоичном виде — 0001, а 2 в двоичном — 0010. Побитовое И делает следующее

    0001
AND 0010
----
0000

Каждая цифра AND предназначена для получения результата.

Побитовое ИЛИ (|) 0001 и 0010 приведет к 0011.

5

Другие решения

Нет, эти два условия не совпадают. (e_adr & 0x20) такой же как (e_adr & 0x20) != 0(и на самом деле, если значение этого выражения не равно нулю, оно может быть только 0x20). Фактически это проверяет, является ли 6-й младший значащий бит e_adr ненулевой

9

(e_adr & 0x20) означает, что вы проверяете, установлен ли 6-й бит справа от e_adr на 1 или нет. Это, конечно, не эквивалентно 1. Например, скажем, e_adr 0x4430, (e_adr & 0x20) становится 0x0020 (в условии if, которое интерпретируется как true или 1). Однако, если e_adr равен 0x4440, (e_adr & 0x20) становится 0x0000 (в условии if, которое интерпретируется как false или 0).

4

e_adr & 0x20

эквивалентно

( e_adr & 0x20 ) == 0x20

то есть это выражение проверяет, установлен ли бит 5 в e_adr (я считаю биты из LSB, начиная с 0)

Я имею в виду, что это выражение используется в выражениях if, относящихся к вашему коду. 🙂

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector