Изменение значения бита в числе по заданной позиции

Для установки бита используйте num | mask, для сброса — num & ~mask, где mask = 1 << pos. Позиция должна быть меньше 32; первый пример в условии ошибочен.

Короткий ответ

Что ответить на собеседовании

Для установки бита используйте num | mask, для сброса — num & ~mask, где mask = 1 << pos. Позиция должна быть меньше 32; первый пример в условии ошибочен.

Подробный разбор

Ответ с пояснениями

Условие

Задача: реализовать функцию set_bit, которая принимает 32‑разрядное беззнаковое число num, позицию бита pos (нумерация с нуля) и булево значение value. Функция должна вернуть новое число, в котором бит на позиции pos установлен в 1, если value истинно, иначе в 0.

std::uint32_t set_bit(std::uint32_t num, std::uint32_t pos, bool value) {
    // реализовать
}

Пример работы:

num = 5 (0101b), pos = 1, value = false → результат 1 (0001b)
num = 5 (0101b), pos = 2, value = true  → результат 5 (0101b)

Ответ

Для установки бита используйте num | mask, для сброса — num & ~mask, где mask = 1 << pos. Позиция должна быть меньше 32; первый пример в условии ошибочен.

#include <cstdint>
#include <stdexcept>

std::uint32_t set_bit(std::uint32_t num, std::uint32_t pos, bool value) {
    if (pos >= 32) throw std::out_of_range("bit position");
    const auto mask = static_cast<std::uint32_t>(std::uint64_t{1} << pos);
    return value ? (num | mask) : (num & ~mask);
}

Биты считаются справа с нуля. В 5 (0101) бит 1 уже равен нулю, поэтому set_bit(5, 1, false) возвращает 5, а не 1. Для получения 1 нужно сбросить бит 2: set_bit(5, 2, false). Установка бита 2 оставляет 5. Время и дополнительная память O(1).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее