ビット演算

出典: YKAwiki

目次

概要

数値を2進数で表現した物をビット列と言います。 ビット列は以下に示すビット演算によって操作することが出来ます。

使う場面は少ないですが、C/C++使い・画像処理使いなら知っておいて損はないはず。

操作方法

値のセット

ビット列といっても実体は単なる数値です。 そのまま

int a = 3;

とか入れれば

0000 0011

がaに入ったことになります。ちなみにC/C++では2進数を直接表記する方法はありません。

16進数を使うと4ビットごとに2進数を分割できるのでわかりやすいです。

int 0xfe;

これは

1111 1110

に対応します。簡単だね!

範囲操作

以下の演算子があります。

  1. "&" AND
  2. "|" OR
  3. "^" XOR ビットの値が異なる場合のみ1。
  4. "~" NOT これだけ単項演算子。"~a"としたときaのビットパターンを反転します。

&

右側の数値で1と指定されている部分のみが残ります。

int a = 0xfe; // 1111 1110
int b = 0x0f; // 0000 1111
int c = a & b;// 0000 1110

|

どちらかの数値が1であれば全て1にセットします

int a = 0xaa; // 1010 1010
int b = 0xf0; // 1111 0000
int c = a | b;// 1111 1010

^

玄人好みのXOR

int a = 0xaa; // 1010 1010
int b = 0xec; // 1110 1100
int c = a ^ b;// 0100 0110

指定ビット操作

特定の1ビットだけを操作します

0を1にする

"|"を使えば終了

//5ビット目を1にしたい
int a = 0x8a; // 1000 1010
int b = 0x10; // 0001 0000
int c = a | b;// 1001 1010

1を0にする

考え方としてはそのビット以外が1となるパターンを用意してフィルタリングすればOK。

//たとえば、5ビット目だけを0にしたいとき
int a = 0xba; // 1011 1010
int b = 0x10; // 0001 0000
int c = ~b;   // 1110 1111
int d = a & b:// 1010 1010

いわゆるマスク操作みたいな感じ