std::shr
ja.cppreference.net から
| ヘッダ <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) |
ビット単位の右回転の結果を計算する (関数テンプレート) |