Я пытаюсь понять некоторый код 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 ++. Но я не
&
это немного операция, где как &&
это логическая операция.
Например, следующее очевидно;
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.
Нет, эти два условия не совпадают. (e_adr & 0x20)
такой же как (e_adr & 0x20) != 0
(и на самом деле, если значение этого выражения не равно нулю, оно может быть только 0x20
). Фактически это проверяет, является ли 6-й младший значащий бит e_adr
ненулевой
(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).
e_adr & 0x20
эквивалентно
( e_adr & 0x20 ) == 0x20
то есть это выражение проверяет, установлен ли бит 5 в e_adr (я считаю биты из LSB, начиная с 0)
Я имею в виду, что это выражение используется в выражениях if, относящихся к вашему коду. 🙂