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言語