C 言語ビット演算子マスター: AND、OR、XOR、シフト、補数
ビット演算子とは?
ビット演算子は整数値の個々のビットを操作します。算術演算子が数値全体で働くのに対し、ビット演算子は二進表現に作用するため、フラグ、ビットマスク、ローレベルデバイス制御などのパフォーマンスクリティカルなタスクに最適です。
C 言語では以下のビット演算子が利用可能です:
| 演算子 | 意味 |
|---|---|
| & | ビット単位 AND |
| | | ビット単位 OR |
| ^ | ビット単位 XOR (排他的論理和) |
| ~ | ビット単位 NOT (1 の補数) |
| << | 左シフト |
| >> | 右シフト |
ビット演算子は整数型のみで定義され、float や double などの浮動小数点型には適用できません。
演算は最下位ビット (LSB) から最上位ビット (MSB) に向かって行われます。以下の真理値表は二進演算の結果をまとめたものです:
オペランド x | オペランド y | x & y | x | y | x ^ y |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
以下のセクションで各演算子を例とともに詳しく解説します。
ビット単位 AND (&)
AND 演算子は、対応する両ビットが 1 の場合のみ 1 を返し、それ以外は 0 を返します。不要なビットをマスクするのによく使用されます。
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0000 1001
ビット単位 OR (|)
OR 演算子は、少なくとも一方のビットが 1 なら 1 を返します。特定のビットをセットするのに便利です。
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0001 1101
ビット単位 XOR (^)
XOR 演算子は、ビットが異なる場合のみ 1 を返します。ビットの切り替え (トグル) に役立ちます。
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0001 0100
例プログラム:
#include <stdio.h>
int main() {
int a = 20; /* 20 = 010100 */
int b = 21; /* 21 = 010101 */
int c = 0;
c = a & b; /* 20 = 010100 */
printf("AND - c = %d\n", c);
c = a | b; /* 21 = 010101 */
printf("OR - c = %d\n", c);
c = a ^ b; /* 1 = 000001 */
printf("XOR - c = %d\n", c);
return 0;
}
出力:
AND - c = 20 OR - c = 21 XOR - c = 1
ビットシフト演算子 (<< および >>)
シフト演算子はビットを指定回数左右に移動させます。
operand << n– 左シフト、右側に 0 を挿入。operand >> n– 右シフト、左側に 0 を挿入。
4 ビット数 1111 での例:
x << 2 → 1100 x >> 2 → 0011
プログラム例:
#include <stdio.h>
int main() {
int a = 20; /* 20 = 010100 */
int c = 0;
c = a << 2; /* 80 = 101000 */
printf("Left shift - c = %d\n", c);
c = a >> 2; /* 5 = 000101 */
printf("Right shift - c = %d\n", c);
return 0;
}
出力:
Left shift - c = 80 Right shift - c = 5
ビット単位補数 (~)
補数演算子はすべてのビットを反転: 1 を 0 に、0 を 1 にします。単一オペランドに適用される単項演算子です。
0000 1111 → 1111 0000
例プログラム:
#include <stdio.h>
int main() {
int a = 10; /* 10 = 001010 */
int c = ~a; /* 2 の補数で -11 */
printf("Complement - c = %d\n", c);
return 0;
}
出力:
Complement - c = -11
すべての演算子を組み合わせた例
以下は、議論したすべてのビット演算子を示す簡潔なプログラムです。
#include <stdio.h>
int main() {
unsigned int x = 48; /* 0011 0000 */
unsigned int y = 13; /* 0000 1101 */
int z = 0;
z = x & y; /* 0 = 0000 0000 */
printf("AND - x & y = %d\n", z);
z = x | y; /* 61 = 0011 1101 */
printf("OR - x | y = %d\n", z);
z = x ^ y; /* 61 = 0011 1101 */
printf("XOR - x ^ y = %d\n", z);
z = ~x; /* -49 = 1111 0100 (2 の補数) */
printf("NOT - ~x = %d\n", z);
z = x << 2; /* 192 = 1100 0000 */
printf("Left shift - x << 2 = %d\n", z);
z = x >> 2; /* 12 = 0000 1100 */
printf("Right shift - x >> 2 = %d\n", z);
return 0;
}
結果:
AND - x & y = 0 OR - x | y = 61 XOR - x ^ y = 61 NOT - ~x = -49 Left shift - x << 2 = 192 Right shift - x >> 2 = 12
重要なポイント
- ビット演算子は整数型専用で、二進レベルで動作する。
- 論理 (AND、OR、XOR)、シフト (左/右)、補数 (~) 操作が含まれる。
- フラグ操作、ローレベル I/O、パフォーマンスクリティカルなコードに不可欠。
C言語
- IoTとブロックチェーン:データ信頼と効率のパラダイムシフト
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C言語キーワードと識別子:実践ガイド
- C言語演算子完全ガイド:算術・関係・論理・ビット演算子
- C++演算子を徹底解説:種類、例、サンプルプログラム付き
- C言語の定数とリテラル:型、使い方、ベストプラクティス
- Python演算子完全ガイド:算術、論理、比較、代入、ビットワイズ、優先順位