Что значит &=?
Я использую termcaps, и я не понимаю, что &=
означает в этом примере:
term.c_lflag &= ~(ICANON);
Может ли кто-нибудь объяснить мне, как это работает?
5 ответов
Это обычный способ установить определенный бит в 0 в целом числе, которое представляет битовое поле.
unsigned a = ...;
// ...
unsigned int mask = 1 << 11; // mask for 12th bit
a |= mask; // set 12th bit to 1
a &= ~mask; // set 12th bit to 0
Включение немного работает побитовымor
число с маской, которая выглядит как 000010000
,
Отключение немного работаетand
число с маской типа 111101111
(отсюда необходимость ~
, что означает побитовое отрицание).
Обратите внимание, что есть и другие опции для управления битовыми полями:
- в C++, используя
std::bitset
или дажеstd::vector<bool>
в C или C++, используя структуру битового поля, как
struct Foo { int foo_enabled : 1; int bar_enabled : 1; // ... };
&=
средства Bit Wise AND
а затем назначить. Например
term.c_lflag = (term.c_lflag) & (~(ICANON))
Во-первых, сделать тerm.c_lflag & ~(ICANON)
затем назначить term.c_lflag
Код отключает бит ICANON, как объясняет Шварц в комментарии: ICANON определяет бит через маску, например 0x8000
(бит ICANON имеет значение 1), когда вы применяете битовый оператор not, ~
все биты "инвертированы", и у вас есть (если значения шириной 16 бит) 0x7FFF
, Если вы вставите поразрядно и (&
) это значение с x, в результате остается неизменным все биты x, совпадающие с битом "1" в маске 0x7FFF
и "отключить" биты x, совпадающие с битом "0" в маске, который в данном конкретном случае является именно битом ICANON.
Около x &= a
Как уже объяснялось, это можно считать просто синтаксическим сахаром для x = x & a
,
Это мало чем отличается от оператора +=
, Просто нравится term.c_lflag &= ~(ICANON);
должен иметь эффект term.c_lflag = term.c_lflag & (~ICANON);
но "на месте". Вы не будете создавать временные, но вместо этого вы будете изменять term.c_lflag
, Пожалуйста, обратите внимание, здесь &
является побитовым оператором И