Что это за операция на С?

Я начал работать с 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);

Операторы & и ~ - это два разных оператора. ~ это НЕ оператор, в котором он преобразует каждый бит с обратным. Оператор & является побитовым оператором И, в котором он сравнивает операнды побитно.

Другие вопросы по тегам