namespace std {
template <class T, class S>
constexpr T shr(T x, S s) noexcept; // C++29
}
概要
値xを右方向にsビットシフトした値(xを2のs乗で割った値)を求める。
組み込みのoperator>>と異なり、シフト量sがTのビット幅以上であっても、また負であっても未定義動作とならない。sが負の場合は、左方向へ-sビットシフトした結果(shl(x, -s))となる。
xが符号付き整数型で負の値の場合は、負の無限大方向に丸められる(算術右シフトに相当する)。
テンプレートパラメータ制約
TとSがそれぞれ符号付きまたは符号なし整数型であること
戻り値
十分な値域をもつ仮想的な整数型でx × 2-sを計算して負の無限大方向に丸め、その結果をstatic_castでTに変換した値を返す。
例外
投げない
備考
shr(x, s)はshl(x, -s)に等しい。
例
#include <bit>
#include <cstdint>
#include <print>
int main()
{
std::uint8_t x = 0b0011'0000;
std::uint8_t r = std::shr(x, 2);
std::println("{:08b}", r);
}
出力
00001100
バージョン
言語
- C++29
処理系
- Clang: 22 ❌
- GCC: 16.1 ❌
- Visual C++: 2026 Update 2 ❌
関連項目
参照
- P3793R1 Better shifting
- C++29で追加された