最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<bit>

# std::rotr(C++20)

    namespace std {
      template <class T>
      [[nodiscard]]
      constexpr T rotr(T x, int s) noexcept; // (1) C++20
      template <class T>
      constexpr T rotr(T x, int s) noexcept; // (1) C++26
    }

## 概要

右循環ビットシフト。

値`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);
    }

### 出力

## バージョン

### 言語

- C++20

### 処理系

- Clang: 9.0 ✅
- GCC: 9.2 ✅
- Visual C++: ??

## 参照

- P0553R4 Bit operations
- P2422R1 Remove `nodiscard` annotations from the standard library specification
  - C++26で`[[nodiscard]]`指定が削除された