C# ビット演算子とビットシフト演算子をマスターする:包括的ガイド
C# ビット演算子とビットシフト演算子
このチュートリアルでは、C# のビット演算子とビットシフト演算子について詳しく学習します。C# には 4 つのビット演算子と 2 つのビットシフト演算子が用意されています。
ビット演算子とビットシフト演算子は、整数型(int、long など)やブール型データに対してビットレベルの操作を行うために使用されます。これらの演算子は実際のアプリケーションではあまり使用されませんが、ローレベルな操作や最適化、フラグ管理などで重要な役割を果たします。
より実践的な応用例に興味がある場合は、ビット演算の実用的な応用を参照してください。
C# で利用可能なビット演算子とビットシフト演算子を以下に示します。
| 演算子 | 演算子名 |
|---|---|
| ~ | ビット単位補数(ビット反転) |
| & | ビット単位 AND |
| | | ビット単位 OR |
| ^ | ビット単位排他的論理和(XOR) |
| << | ビット単位左シフト |
| >> | ビット単位右シフト |
ビット単位 OR
ビット単位 OR 演算子は | で表され、2 つのオペランドの対応するビット間で OR 操作を実行します。いずれかのビットが 1 であれば結果は 1、そうでなければ 0 になります。
オペランドが bool 型の場合、ビット単位 OR 操作はそれらの間の論理 OR 操作と等価です。
例:
14 = 00001110 (2進数) 11 = 00001011 (2進数)
14 と 11 のビット単位 OR 操作:
00001110 00001011 -------- 00001111 = 15 (10進数)
例 1:ビット単位 OR
using System;
namespace Operator {
class BitWiseOR {
public static void Main(string[] args) {
int firstNumber = 14, secondNumber = 11, result;
result = firstNumber | secondNumber;
Console.WriteLine("{0} | {1} = {2}", firstNumber, secondNumber, result);
}
}
}
実行結果:
14 | 11 = 15
ビット単位 AND
ビット単位 AND 演算子は & で表され、2 つのオペランドの対応するビット間で AND 操作を実行します。いずれかのビットが 0 であれば結果は 0、両方が 1 の場合のみ 1 になります。
オペランドが bool 型の場合、ビット単位 AND 操作は論理 AND 操作と等価です。
例:
14 = 00001110 (2進数) 11 = 00001011 (2進数)
14 と 11 のビット単位 AND 操作:
00001110 00001011 -------- 00001010 = 10 (10進数)
例 2:ビット単位 AND
using System;
namespace Operator {
class BitWiseAND {
public static void Main(string[] args) {
int firstNumber = 14, secondNumber = 11, result;
result = firstNumber & secondNumber;
Console.WriteLine("{0} & {1} = {2}", firstNumber, secondNumber, result);
}
}
}
実行結果:
14 & 11 = 10
ビット単位 XOR
ビット単位 XOR 演算子は ^ で表され、2 つのオペランドの対応するビット間で排他的論理和を実行します。対応するビットが同じ場合は 0、異なる場合は 1 になります。
オペランドが bool 型の場合、ビット単位 XOR 操作は論理 XOR 操作と等価です。
例:
14 = 00001110 (2進数) 11 = 00001011 (2進数)
14 と 11 のビット単位 XOR 操作:
00001110 00001011 -------- 00000101 = 5 (10進数)
XOR の活用法について詳しく知りたい場合は、「XOR の魔法」を参照してください。
例 3:ビット単位 XOR
using System;
namespace Operator {
class BitWiseXOR {
public static void Main(string[] args) {
int firstNumber = 14, secondNumber = 11, result;
result = firstNumber ^ secondNumber;
Console.WriteLine("{0} ^ {1} = {2}", firstNumber, secondNumber, result);
}
}
}
実行結果:
14 ^ 11 = 5
ビット単位補数(ビット反転)
ビット単位補数演算子は ~ で表され、単項演算子(1 つのオペランドのみで動作)です。この演算子は各ビットを反転させます(1 を 0 に、0 を 1 に変更)。
例:
26 = 00011010 (2進数)
26 に対するビット単位補数操作:
~ 00011010 = 11100101 = 229 (10進数)
例 4:ビット単位補数
using System;
namespace Operator {
class BitWiseComplement {
public static void Main(string[] args) {
int number = 26, result;
result = ~number;
Console.WriteLine("~{0} = {1}", number, result);
}
}
}
実行結果:
~26 = -27
なぜこの結果になるのか?
期待していた 229 ではなく -27 が出力されました。これは、バイナリ値 11100101 が 2 の補数表現では -27 を表すためです。コンピュータでは負の数は 2 の補数表現で格納されます。
任意の整数 n に対して、n の 2 の補数は -(n+1) となります。
| 10進数 | 2進数 | 2の補数 |
|---|---|---|
| 0 | 00000000 | -(11111111 + 1) = -00000000 = 0 |
| 1 | 00000001 | -(11111110 + 1) = -11111111 = -1 |
| 229 | 11100101 | -(00011010 + 1) = -00011011 = -27 |
2 の補数ではオーバーフロー値は無視されます。
26 のビット単位補数は 10 進数で 229 ですが、229 の 2 の補数は -27 です。したがって出力は -27 になります。
ビット単位左シフト
ビット単位左シフト演算子は << で表され、数値を指定されたビット数だけ左にシフトします。最下位ビットには 0 が詰められます。
10 進数では以下と等価です:
num * 2^bits
例:
42 = 101010 (2進数)
42 に対する左シフト操作:
42 << 1 = 84 (2進数 1010100) 42 << 2 = 168 (2進数 10101000) 42 << 4 = 672 (2進数 1010100000)
例 5:ビット単位左シフト
using System;
namespace Operator {
class LeftShift {
public static void Main(string[] args) {
int number = 42;
Console.WriteLine("{0}<<1 = {1}", number, number << 1);
Console.WriteLine("{0}<<2 = {1}", number, number << 2);
Console.WriteLine("{0}<<4 = {1}", number, number << 4);
}
}
}
実行結果:
42<<1 = 84 42<<2 = 168 42<<4 = 672
ビット単位右シフト
ビット単位右シフト演算子は >> で表され、数値を指定されたビット数だけ右にシフトします。第 1 オペランドが第 2 オペランドで指定されたビット数だけ右にシフトされます。
10 進数では以下と等価です:
floor(num / 2^bits)
例:
42 = 101010 (2進数)
42 に対する右シフト操作:
42 >> 1 = 21 (2進数 010101) 42 >> 2 = 10 (2進数 001010) 42 >> 4 = 2 (2進数 000010)
例 6:ビット単位右シフト
using System;
namespace Operator {
class LeftShift {
public static void Main(string[] args) {
int number = 42;
Console.WriteLine("{0}>>1 = {1}", number, number >> 1);
Console.WriteLine("{0}>>2 = {1}", number, number >> 2);
Console.WriteLine("{0}>>4 = {1}", number, number >> 4);
}
}
}
実行結果:
42>>1 = 21 42>>2 = 10 42>>4 = 2
C言語
- IoTとブロックチェーン:データ信頼と効率のパラダイムシフト
- C# キーワードと識別子:ルール、一覧、ベストプラクティス完全ガイド
- C#演算子完全ガイド:C#における演算子の包括的解説
- C# ビット演算子とビットシフト演算子をマスターする:包括的ガイド
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C言語演算子完全ガイド:算術・関係・論理・ビット演算子
- C++演算子を徹底解説:種類、例、サンプルプログラム付き
- C 言語ビット演算子マスター: AND、OR、XOR、シフト、補数
- Python 演算子完全マスター: 包括的ガイド
- Python演算子完全ガイド:算術、論理、比較、代入、ビットワイズ、優先順位
- Java演算子をマスター:種類、構文、実践例