Namespaces
Variants

std::shr

Из ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (основные типы, RTTI)
Макросы проверки функций библиотеки (C++20)
Утилиты программы
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Реляционные операторы (устарело в C++20)
 
 
Определён в заголовке <bit>
template< class T, class S >
constexpr T shr( T x, S s ) noexcept;
(начиная с C++29)

Возвращает ⌊x · 2-s
⌋
округлённое в сторону отрицательной бесконечности и усечённое, чтобы поместиться в T.

Параметры

x - значение беззнакового целого типа
s - количество позиций для сдвига

Возвращаемое значение

⌊x · 2-s
⌋
усечённое до типа результата.

Примечания

В отличие от оператора >>, std::shr никогда не вызывает неопределённого поведения. Сдвиг выполняется так, как если бы производился сдвиг вправо на один бит s раз, или сдвиг влево на один бит -s раз, если s отрицательно, за исключением того, что -s не может вызвать переполнение.

Макрос проверки функции макрос Значение Стандарт Функция
__cpp_lib_bitops 202606L (C++29) Улучшенный сдвиг

Возможная реализация

template<class T, class S> // TODO: constraints
constexpr T shr(T x, S s) noexcept
{
    constexpr auto width = S(std::numeric_limits<std::make_unsigned_t<T>>::digits);
    if constexpr (std::is_signed_v<S>)
    {
        if (s < 0)
            return s <= -width ? T(0) : x << -s;
    }
    return s >= width ? T(x < 0 ? -1 : 0) : x >> s;
}

Пример

Смотреть также

(C++29)
сдвигает влево без возможности неопределённого поведения
(шаблон функции)
(C++20)
вычисляет результат побитового вращения влево
(шаблон функции)
(C++20)
вычисляет результат побитового вращения вправо
(шаблон функции)