最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

function
<valarray>

# std::gslice_array::operator^=

    void operator^=(const ValOrProxy<T>& xs) const;

## 概要

排他的論理和の複合代入を行う。

## 効果

元となる `valarray` オブジェクトから参照によって抽出した各要素に、`xs` の各要素を排他的論理和する。

## 戻り値

なし

## 備考

- 引数の型 `ValOrProxy` は、`valarray`、あるいは、その代理となる型である。
  `<valarray>` の概要も参照のこと。
- `valarray` から抽出した要素数と `xs` の要素数が異なる場合、未定義動作を引き起こす。

## 例

    #include <iostream>
    #include <valarray>
    #include <bitset>
    #include <numeric>
    #include <functional>

    std::size_t product(const std::valarray<std::size_t>& va)
    {
      return std::accumulate(
               std::begin(va),
               std::end(va),
               1u,
               std::multiplies<std::size_t>());
    }

    int main()
    {
      std::valarray<int> va = {
        0b00000101,
        0b00001010,
        0b00010101
      };

      const std::size_t start = 0u;  // 開始位置
      const std::valarray<std::size_t> lengths = {3u}; // 要素数
      const std::valarray<std::size_t> strides = {1u}; // 何個置きに処理するか

      // 抽出した要素に0b11を排他的論理和する
      // lengthを掛け合わせたものがgsliceで抽出した配列の長さ
      va[std::gslice(start, lengths, strides)] ^= std::valarray<int>(0b00000011, product(lengths));

      for (int x : va) {
        std::cout << std::bitset<8>(x).to_string() << std::endl;
      }
    }

### 出力

    00000110
    00001001
    00010110