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;
}
|
Пример
См. также
|
(C++29) | выполняет сдвиг вправо без возможности неопределённого поведения (шаблон функции) |
|
(C++20) | вычисляет результат побитового циклического сдвига влево (шаблон функции) |
|
(C++20) | вычисляет результат побитового циклического сдвига вправо (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/shl