こんにちは、現役SEの「とも」です。
今回は、ビット演算子について説明します。
- ビット演算子は、ビット単位で論理積(AND)や論理和(OR)、排他的論理和(XOR)や否定(NOT)を計算するための演算子です。
- 整数型の「リテラル」または「変数」が使用できます。
ビット演算は非常に高速ですが、扱いが難しいのでメモリ制限が厳しい環境や高パフォーマンスが必要な「ゲーム」や「画像、映像系」でよく使われます。
ビジネス系では論理演算子を使うことが多く、ビット演算子はビットをマスクする用途以外はあまり使われていないと思います。
【ビット演算子】
演算子 | 例 | 説明 |
---|---|---|
& | A & B | ビット単位で論理積(AND)を演算する。 AとBの両方が「1」の場合は「1」、それ以外は「0」 |
| | A | B | ビット単位で論理和(OR)を演算する。 AまたはBのどちらかが「1」の場合は「1」、それ以外は「0」 |
^ | A ^ B | ビット単位で排他的論理和(XOR)を演算する。 AとBの両方が「1」またはAとBの両方が「0」の場合は「1」、それ以外は「0」 |
~ | ~A | ビット単位で否定(NOT)を演算する。 Aが「0」の場合は「1」、「1」の場合は「0」 |
各ビット演算子のサンプル
【論理積(AND)】
int a = 0b0101_0101_0101_0101_0101_0101_0101_0101;
int b = 0b0000_0000_0000_0000_1111_1111_1111_1111;
int c = a & b;
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【bの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【a & bの結果】");
【結果】
01010101010101010101010101010101 【aの値】
00000000000000001111111111111111 【bの値】
--------------------------------
00000000000000000101010101010101 【a & bの結果】
【論理和(OR)】
int a = 0b0101_0101_0101_0101_0101_0101_0101_0101;
int b = 0b0000_0000_0000_0000_1111_1111_1111_1111;
int c = a | b;
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【bの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【a | bの結果】");
【結果】
01010101010101010101010101010101 【aの値】
00000000000000001111111111111111 【bの値】
--------------------------------
01010101010101011111111111111111 【a | bの結果】
【排他的論理和(XOR)】
int a = 0b0101_0101_0101_0101_0101_0101_0101_0101;
int b = 0b0000_0000_0000_0000_1111_1111_1111_1111;
int c = a ^ b;
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【bの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【a ^ bの結果】");
【結果】
01010101010101010101010101010101 【aの値】
00000000000000001111111111111111 【bの値】
--------------------------------
01010101010101011010101010101010 【a ^ bの結果】
【否定(NOT)】
int a = 0b0101_0101_0101_0101_0101_0101_0101_0101;
int c = ~a;
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【~aの結果】");
【結果】
01010101010101010101010101010101 【aの値】
--------------------------------
10101010101010101010101010101010 【~aの結果】
【論理積(AND)と否定(NOT)の組み合わせ】
int a = 0b0101_0101_0101_0101_0101_0101_0101_0101;
int b = 0b0000_0000_0000_0000_1111_1111_1111_1111;
int c = a & ~b;
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【bの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【a & ~bの結果】");
【結果】
01010101010101010101010101010101 【aの値】
00000000000000001111111111111111 【bの値】
--------------------------------
01010101010101010000000000000000 【a & ~bの結果】
【論理和(OR)と否定(NOT)の組み合わせ】
int a = 0b0101_0101_0101_0101_0101_0101_0101_0101;
int b = 0b0000_0000_0000_0000_1111_1111_1111_1111;
int c = a | ~b;
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【bの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【a | ~bの結果】");
【結果】
01010101010101010101010101010101 【aの値】
00000000000000001111111111111111 【bの値】
--------------------------------
11111111111111110101010101010101 【a | ~bの結果】
【排他的論理和(XOR)と否定(NOT)の組み合わせ】
int a = 0b0101_0101_0101_0101_0101_0101_0101_0101;
int b = 0b0000_0000_0000_0000_1111_1111_1111_1111;
int c = a ^ ~b;
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【aの値】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【bの値】");
System.out.println("--------------------------------");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【a ^ ~bの結果】");
【結果】
01010101010101010101010101010101 【aの値】
00000000000000001111111111111111 【bの値】
--------------------------------
10101010101010100101010101010101 【a ^ ~bの結果】