Namespaces
Variants

std::shl

ja.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 shl( T x, S s ) noexcept;
(C++29 から) で定義

戻り値は ⌊x · 2s
⌋
を負の無限大方向に丸め、T に収まるように切り詰めたものです。

引數

x - 符号なし整数型の値
s - シフトする位置の數

戻り値

⌊x · 2s
⌋
を結果の型に切り詰めたもの。

ノート

<< 演算子とは異なり、std::shl は未定義動作を引き起こすことはありません。 シフトは、1 ビット左シフトを s 回行うか、-s が負の場合は 1 ビット右シフトを 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)
ビット単位の右ローテートの結果を計算する
(関数テンプレート)