C++:排他的論理和(xor)メモ ^= ←これ

a,bがあるときどっちか片方が 1 のときに 1 を返す。bit で考えないといけないので2進数で各桁ごとに結果がでる。

#include <bits/stdc++.h>

using namespace std;

int main(){
  int a,b;
  a = b = 0;
  a ^= b;
  cout << "a=0,b=1" << endl;
  cout << "a=" << a << endl;
  a = 0;
  b = 1;
  a ^= b;
  cout << "a=0,b=1" << endl;
  cout << "a=" << a << endl;
  a = 1;
  b = 0;
  a ^= b;
  cout << "a=1,b=0" << endl;
  cout << "a=" << a << endl;
  a = b = 1;
  a ^= b;
  cout << "a=1,b=1" << endl;
  cout << "a=" << a << endl;
}

出力

a=0,b=1
a=0
a=0,b=1
a=1
a=1,b=0
a=1
a=1,b=1
a=0

a,b が 1 よりも大きい時は二進数の桁ごとにとるので計算がめんどくさい気がする。

#include <bits/stdc++.h>

using namespace std;

int main(){
  int a,b;
  a = b = 10;
  cout << "a=" << a << ",b=" << b << endl;
  a ^= b;
  cout << "a=" << a << ",b=" << b << endl;
  a = 10;
  b = 20;
  cout << "a=" << a << ",b=" << b << endl;
  a ^= b;
  cout << "a=" << a << ",b=" << b << endl;
  a = 20;
  b = 30;
  cout << "a=" << a << ",b=" << b << endl;
  a ^= b;
  cout << "a=" << a << ",b=" << b << endl;
}

出力

a=10,b=10
a=0,b=10
a=10,b=20
a=30,b=20
a=20,b=30
a=10,b=30

a の数が増えているのは 2進数で排他的論理和をとっているため。
最初は a,b = 10 なので2進数でも同じになる。
a = 1010
b = 1010
でそれぞれの桁で計算している 両方 0 または両方 1 のときは 0 を返すためそれぞれの桁で 0 が返されて出力が 0 になる。
次の a = 10,b = 20 では
a = 1010
b = 10100
それぞれの桁で排他的論理和をとると
11110 で 10進数にすると 16 + 8 + 4 + 2 + 0 = 30 になり、それが出力される。

a = 20,b = 30 も同じように計算すると
a = 10100
b = 11110
一番上の桁と三番目の桁と一番下の桁で 0 が返されるので
01010 になる。
これを 10進数にすると 0 + 8 + 0 + 2 + 0 = 10 になり、それが出力される。

if(a ^ b){
//処理
}

は 1 より大きい数を使うと二進数に直されて計算されて、一桁でも 1 になると if の中身が実行されるっぽい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA