Spec-Zone.ru › C++

std::shl

Определён в заголовочном файле <bit>
template< class T, class S >
constexpr T shl( T x, S s ) noexcept;
(начиная с C++29)

Возвращает \(\small{\lfloor x \times 2^{s} \rfloor}\)⌊x · 2s⌋ с округлением в сторону минус бесконечности и усечением до T.

Параметры

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

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

\(\small{\lfloor x \times 2^{s} \rfloor}\)⌊x · 2s⌋, усечённое до типа результата.

Примечания

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

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

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

template<class T, class S> // TODO: constraints
constexpr T shl(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(x < 0 ? -1 : 0) : x >> -s;
    }
    return s >= width ? T(0) : x << s;
}

Пример

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/shl

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API