理解できません。出力が「等しい」理由
コード:
if (-3 == ~2)
Console.WriteLine("equal");
else
Console.WriteLine("not equal");
出力:
equal
理解できません。出力が「等しい」理由
コード:
if (-3 == ~2)
Console.WriteLine("equal");
else
Console.WriteLine("not equal");
出力:
equal
2の補数のビット演算により、
ウィキペディアのページから削除して展開しました:
Most
Significant
Bit 6 5 4 3 2 1 0 Value
0 0 0 0 0 0 1 1 3
0 0 0 0 0 0 1 0 2
0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 -1
1 1 1 1 1 1 1 0 -2
1 1 1 1 1 1 0 1 -3
1 1 1 1 1 1 0 0 -4
だからあなたは得る:
0 0 0 0 0 0 1 0 = 2
1 1 1 1 1 1 0 1 = -3
ご覧のとおり、すべてのビットが反転しています。これは、ビット単位のNOT演算子(~)が行うことです。
このstackoverflowの投稿は、その理由を説明しています。
単項の補数演算子です。オペランドのビットを反転します。2の補数演算では、〜x == -x-1
これは、符号付き整数の2の補数表現によるものです:http://en.wikipedia.org/wiki/Twos_complement
2の補数を使用しているためです。
これら2つの演算子には大きな違いがあります。
「〜演算子は、そのオペランドに対してビット単位の補数演算を実行します。これにより、各ビットが逆になります。ビット単位の補数演算子は、int、uint、long、およびulongに対して事前定義されています。」
3の2の補数は次のとおりです。
1 ... 1101
(署名された)2の補数は次のとおりです。
1 ... 1101
簡単にできます。
1の補数:ビットを反転します。2の補数:1の補数+1。
なぜこれが便利なのですか?コンピューターは、ビットを反転して加算するだけで数値を減算できます。