Удалить / добавить значение из флагов

165
20 июня 2018, 21:10

Какими из операторов можно проверить присутствие флага, и удалить его если он есть, в противном случае добавить?

Значения флагов имеет тип uint32_t.

bool window::set_fullscreen(const bool value) const
{
    uint32_t flags = SDL_GetWindowFlags(m_window_.get());
    if(flags & SDL_WINDOW_FULLSCREEN)
    {
        if(value)
        {
            return true;
        }
        flags &= SDL_WINDOW_FULLSCREEN; // удалить флаг если значение value false
    }
    else
    {
        // Тут необходимо добавить флаг в значение flags и вызвать соответствующую ф-цию
    }
    return SDL_SetWindowFullscreen(m_window_.get(), flags) == 0;
}
Answer 1

Если переменная флагов - flags, а конкретный бит - mask (например, 000100 в бинарной записи), то

Проверка установленности:

if (flags&mask) { установлен }

Установка флага:

flags |= mask;

Сброс флага:

flags &= ~mask;

Изменение флага на противоположный:

flags ^= mask;
Answer 2

Видимо, флаги здесь соответствуют выставленным битам, например FlagX = 0x00000800 означает, что 11-й бит установлен.

Для установки флага используется битовое ИЛИ

flags = flags | FlagX

Для сброса нужно, не портя других битов, обнулить конкретный. Для этого инвертируем константу флага (все биты становятся единичными, кроме данного) и выполняем битовое И

flags = flags & (~FlagX)
READ ALSO
OpenGL и клавиатура

OpenGL и клавиатура

Есть проект, на C++ с OpenGL - просто камера, которой можно управлять с помощью клавиатурыНо когда включена русская раскладка, то камера не перемещается,...

246
Сортировка бинарного дерева

Сортировка бинарного дерева

Есть вот такая вот программа которая входящие данные забивает в бинарное дерево, а потом считает количество обращений к элементамНужно после...

227
Замена подстроки в строке с++

Замена подстроки в строке с++

Есть в котором встречаются <i> и </i>Заменить каждое вхождение <i> на <курсив>, а каждое вхождение </i> на <конец курсив>

173
Проверка числа на n-значность числа

Проверка числа на n-значность числа

Программа запрашивает у пользователя шестизначное числоВывести на экран, соблюдал ли он правила

298