Namespaces
Variants

std::shl

От 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)
Функции сравнения целых чисел
(C++20)(C++20)(C++20)    
(C++20)
Обмен (swap) и операции с типами
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие типы словаря
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



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

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

Параметры

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

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

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

Примечания

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

Макрос проверки возможностей (feature-test) Значение Стандарт Возможность
__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;
}

Пример

См. также

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