C# のビット単位およびビット シフト演算子
C# のビット単位およびビット シフト演算子
このチュートリアルでは、C# のビット単位演算子とビット シフト演算子について詳しく学習します。 C# は、4 つのビット単位および 2 ビットのシフト演算子を提供します。
ビット単位およびビット シフト演算子は、整数 (int、long など) およびブール データに対してビット レベルの演算を実行するために使用されます。これらの演算子は、実際の状況では一般的に使用されません。
さらに詳しく知りたい場合は、ビット演算の実用的なアプリケーションにアクセスしてください。
C# で使用できるビットごとの演算子とビット シフト演算子を以下に示します。
| 演算子 | オペレーター名 |
|---|---|
| ~ | ビット単位の補数 |
| & | ビットごとの AND |
| | | ビットごとの OR |
| ^ | ビットごとの排他的 OR (XOR) |
| << | ビット単位の左シフト |
| >> | ビットごとの右シフト |
ビットごとの OR
ビットごとの OR 演算子は | で表されます . 2 つのオペランドの対応するビットに対してビットごとの OR 演算を実行します。いずれかのビットが 1 の場合 、結果は 1 です .それ以外の場合、結果は 0 です .
オペランドが bool 型の場合 、ビットごとの OR 演算は、それらの間の論理 OR 演算と同等です。
たとえば、
14 = 00001110 (In Binary) 11 = 00001011 (In Binary)
ビット単位の OR 14時から11時までの運行:
00001110 00001011 -------- 00001111 = 15 (In Decimal)
例 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 です .
オペランドが bool 型の場合 、ビットごとの AND 演算は、それらの間の論理 AND 演算と同等です。
たとえば、
14 = 00001110 (In Binary) 11 = 00001011 (In Binary)
14 と 11 の間のビットごとの AND 演算:
00001110 00001011 -------- 00001010 = 10 (In Decimal)
例 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 つのオペランドの対応するビットに対してビット単位の XOR 演算を実行します。対応するビットが同じの場合 、結果は 0 です .対応するビットが異なる場合 、結果は 1 です .
オペランドが bool 型の場合 、ビットごとの XOR 演算は、それらの間の論理 XOR 演算と同等です。
たとえば、
14 = 00001110 (In Binary) 11 = 00001011 (In Binary)
14 と 11 の間のビット単位の XOR 演算:
00001110 00001011 -------- 00000101 = 5 (In Decimal)
Bitwise XOR の使用法について詳しく知りたい場合は、The Magic of 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 (In Binary)
26 のビット単位の補数演算:
~ 00011010 = 11100101 = 229 (In Decimal)
例 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
-27 を取得しました 229 を期待していたときの出力として . なぜそうなったのですか?
バイナリ値 11100101 が原因で発生します これは 229 であると予想されます 実際には -27 の 2 の補数表現です .コンピューターの負の数は、2 の補数表現で表されます。
整数 n の場合、n の 2 の補数 -(n+1) になります .
| 10 進数 | バイナリ | 2 の補数 |
|---|---|---|
| 0 | 00000000 | -(11111111 + 1) =-00000000 =-0 (10 進数) |
| 1 | 00000001 | -(11111110 + 1) =-11111111 =-256 (10 進数) |
| 229 | 11100101 | -(00011010 + 1) =-00011011 =-27 |
オーバーフロー値は 2 の補数では無視されます。
26 のビットごとの補数 は 229 (10 進数) で、229 の 2 の補数です。 -27 です .したがって、出力は -27 です 229 の代わりに .
ビット単位の左シフト
ビットごとの左シフト演算子は << で表されます . << 演算子は、数値を指定されたビット数だけ左にシフトします。最下位ビットにゼロが追加されます。
10 進数では、
に相当します。num * 2bits
たとえば、
42 = 101010 (In Binary)
42 でのビット単位のリフト シフト操作:
42 << 1 = 84 (In binary 1010100) 42 << 2 = 168 (In binary 10101000) 42 << 4 = 672 (In binary 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 / 2bits)
たとえば、
42 = 101010 (In Binary)
42 でのビット単位のリフト シフト操作:
42 >> 1 = 21 (In binary 010101) 42 >> 2 = 10 (In binary 001010) 42 >> 4 = 2 (In binary 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言語