Namespaces
Variants

std::shr

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で非推奨)
 
ビット操作
(C++20)
(C++23)
2の整数乗2
(C++20)
(C++20)
(C++20)
シフト
(C++29)
(C++29)
回転
(C++20)
(C++20)
カウント
(C++20)
(C++20)
(C++20)
順列
(C++29)
(C++29)
エンディアン
(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 は未定義動作を起こしません。 シフトは、1ビット右シフトを s 回、または1ビット左シフトを -s 回(s が負の場合)行うかのように行われますが、-s がオーバーフローすることはありません。

機能テストマクロ 値 Std 機能
__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)
ビット単位の右回転の結果を計算する
(関数テンプレート)