- bit[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp29[meta cpp]
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);
}- std::shr[color ff0000]
00001100
- C++29
- Clang: 22 [mark noimpl]
- GCC: 16.1 [mark noimpl]
- Visual C++: 2026 Update 2 [mark noimpl]
- P3793R1 Better shifting
- C++29で追加された