namespace std {
template <class T>
[[nodiscard]] constexpr T rotr(T x, int s) noexcept;
}
概要
右循環ビットシフト。
値x
をシフト量s
だけ右に循環シフトする。
テンプレートパラメータ制約
- 型
T
が符号なし整数型であること
戻り値
符号なし整数型T
のビット数をN
、s % N
をr
であるとして。
r
が0である場合はx
が返るr
が正である場合は(x >> r) | (x << (N - r))
が返るr
が負である場合はrotl(x, -r)
が返る
例外
投げない
備考
- この関数は、ハードウェア機能として提供されている場合がある
例
#include <cassert>
#include <bit>
#include <cstdint>
int main()
{
auto i = static_cast<std::uint32_t>(0b0000'0000'0000'0000'0000'0000'0000'1000u);
std::uint32_t a = std::rotr(i, 4);
assert(a == 0b1000'0000'0000'0000'0000'0000'0000'0000u);
std::uint32_t b = std::rotr(i, -4);
assert(b == 0b0000'0000'0000'0000'0000'0000'1000'0000u);
}
xxxxxxxxxx
#include <cassert>
#include <bit>
#include <cstdint>
int main()
{
auto i = static_cast<std::uint32_t>(0b0000'0000'0000'0000'0000'0000'0000'1000u);
std::uint32_t a = std::rotr(i, 4);
assert(a == 0b1000'0000'0000'0000'0000'0000'0000'0000u);
std::uint32_t b = std::rotr(i, -4);
assert(b == 0b0000'0000'0000'0000'0000'0000'1000'0000u);
}
出力
バージョン
言語
- C++20
処理系
- Clang: 9.0 ✅
- GCC: 9.2 ✅
- Visual C++: ??