Как ios :: fmtflags работает в C ++? Как работает setf ()? - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь понять форматированные флаги потока ios. Может кто-нибудь объяснить, как работает эта cout.setf(ios::hex | ios::showbase) вещь? Я имею в виду, как оператор or (|) работает между двумя отформатированными флагами ios? Прошу прощения за мой плохой английский sh.

1 Ответ

0 голосов
/ 15 февраля 2020

std::ios_base::hex и std::ios_base::showbase оба являются перечислителями BitmaskType std::ios_base::fmtflags. A BitmaskType обычно является типом перечисления, чьи перечислители имеют различные степени двоичности, вроде этого: (1 << n означает 2 n )

// simplified; can also be implemented with integral types, std::bitset, etc.
enum fmtflags : unsigned {
    dec      = 1 << 0, // 1
    oct      = 1 << 1, // 2
    hex      = 1 << 2, // 4
    // ...
    showbase = 1 << 9, // 512
    // ...
};

Оператор | является оператором бита или, который выполняет операцию или с соответствующими битами, поэтому

hex             0000 0000 0000 0100
showbase        0000 0010 0000 0000
                -------------------
hex | showbase  0000 0010 0000 0100

Этот метод может использоваться для объединения флагов, поэтому каждый бит в битовая маска представляет отдельный флаг (установлен или не установлен). Тогда каждый флаг может быть

  • запрошено: mask & flag;

  • установлено: mask | flag;

  • unset: mask & (~flag).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...