Что значит &=?

Я использую 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 = (term.c_lflag) & (~ICANON)

Это мало чем отличается от оператора +=, Просто нравится term.c_lflag &= ~(ICANON); должен иметь эффект term.c_lflag = term.c_lflag & (~ICANON); но "на месте". Вы не будете создавать временные, но вместо этого вы будете изменять term.c_lflag, Пожалуйста, обратите внимание, здесь & является побитовым оператором И

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