最終更新日時:
が更新

履歴 編集

function
<simd>

std::simd::basic_vec::operator>>(C++26)

friend constexpr basic_vec
  operator>>(const basic_vec& lhs, const basic_vec& rhs) noexcept; // (1)

friend constexpr basic_vec
  operator>>(const basic_vec& v, simd-size-type n) noexcept;       // (2)

概要

basic_vecオブジェクトの各要素を右ビットシフトする。要素型が整数型である場合に使用できる。

  • (1) : 対応する要素同士で、lhsの各要素をrhsの対応する要素分だけ右シフトする。
  • (2) : vの各要素を、スカラ値n分だけ右シフトする。

いずれもHidden friendsとして定義される。

テンプレートパラメータ制約

  • (1) : 式a >> babvalue_type型)が適格であること。
  • (2) : 式a >> bavalue_type型、bsimd-size-type型)が適格であること。

戻り値

  • (1) : lhsrhsに右シフトを要素ごとに適用した結果で初期化されたbasic_vecオブジェクトを返す。
  • (2) : i番目の要素をv[i] >> nとしたbasic_vecオブジェクトを返す。

#include <simd>
#include <print>
#include <cstdint>

namespace simd = std::simd;

int main()
{
  simd::vec<std::uint8_t, 4> a = std::uint8_t{16};    // {16, 16, 16, 16}
  simd::vec<std::uint8_t, 4> b = [](int i) { return static_cast<std::uint8_t>(i + 1); };  // {1, 2, 3, 4}

  // (1) 要素ごとのシフト量
  simd::vec<std::uint8_t, 4> c = a >> b;

  // (2) スカラのシフト量
  simd::vec<std::uint8_t, 4> e = [](int i) { return static_cast<std::uint8_t>(16 << i); };  // {16, 32, 64, 128}
  simd::vec<std::uint8_t, 4> d = e >> 2;

  for (int i = 0; i < c.size(); ++i) {
    std::println("{:08b} >> {:08b} -> {:08b}", a[i], b[i], c[i]);
  }
  for (int i = 0; i < d.size(); ++i) {
    std::println("{:08b} >> 2 -> {:08b}", e[i], d[i]);
  }
}

出力

00010000 >> 00000001 -> 00001000
00010000 >> 00000010 -> 00000100
00010000 >> 00000011 -> 00000010
00010000 >> 00000100 -> 00000001
00010000 >> 2 -> 00000100
00100000 >> 2 -> 00001000
01000000 >> 2 -> 00010000
10000000 >> 2 -> 00100000

バージョン

言語

  • C++26

処理系

関連項目

参照