Для установки бита используйте 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).