chacoderのブログ

競技プログラミングそのほか

ビット和代入

EDPC K問題(stone)のけんちょんさんの解説で見慣れない演算がでてきました。

K - Stones


ゲームを解く!Educational DP Contest K, L 問題の解説 - Qiita

if (i - a[j] >= 0) dp[i] |= !dp[i - a[j]];


この縦棒に=をくっつけた演算子(|=)はビット論理和代入というらしいです。

演算の内容はビット単位で論理和をとり左のオペランドに代入するということのようです。

左のオペランドに0を入れておき右のオペランドに1つでも1が入っていれば1を出力する、という働きになりそうです。

使用例

数列の中に奇数が入っているかどうかを判別するプログラムを書いてみました。
入力された数列に奇数が入っていたら1を出力します。

#include <bits/stdc++.h>
using namespace std;

int main(){
  int n;
  cin>>n;
  int A[100];
  for(int i=0;i<n;i++){
    cin>>A[i];
  }
  bool k=0;
  for(int i=0;i<n;i++){
    k |= !(A[i]%2==0);
  }
  cout<<k<<endl;
  return 0;
}

入力

5
2 4 5 8 10

出力

1