Что это за операция на С?
Я начал работать с termcaps, и я увидел этот вид операции.
term.c_lflag &= ~(ICANON);
я знаю &=
это binary AND
и мне это не очень удобно.
Почему просто не использовать =
или сделать #define
и что &= ~
делать?
3 ответа
Если предположить, ICANON
является битовой маской, т. е. целым числом с битами, установленными для представления некоторой функции, этот оператор будет гарантировать, что эти биты не установлены в c_lflag
,
Это часто называют "маскировкой" этих битов.
Операция является побитовой И с побитовой обратной (~
является побитовым обратным).
Итак, если значение c_lflag
3 (двоичная 112) до операции, и ICANON
имеет значение 2 (двоичное 102), оно станет 1, так как оно поразрядно-И: редактируется со значением ~2
в котором установлены все биты, кроме бита номер 1 (двоичный файл... 111012).
Это также может быть написано более подробно, как
term.c_lflag = term.c_lflag & ~ICANON;
Скобки вокруг ICANON
не должно быть нужно.
Ваша строка удалить бит (ы) ICANON
от term.c_lflag
:
Предполагая, что члены имеют длину 4 бита, если значение ICANON
4 (0100b), то значение ~ICANON
равно 11 (1011b) и так:
term.c_lflag 1 1 1 0
AND ~ICANON 1 0 1 1
---------------------
1 0 1 0
==> 1010b, 10 в десятичном виде
term.c_lflag &= ~(ICANON);
равно
term.c_lflag = term.c_lflag & ~(ICANON);
Операторы & и ~ - это два разных оператора. ~ это НЕ оператор, в котором он преобразует каждый бит с обратным. Оператор & является побитовым оператором И, в котором он сравнивает операнды побитно.