ビットごとのNOT演算子(~
ほとんどの言語で)次の値を次のように変換します。
-2 -> 1
-1 -> 0
0 -> -1
1 -> -2
すべきではない-2
に変換 2
、1
に変換 -1
など?
多くの言語での負の整数の表現については、 2の補数 を参照してください。ご覧のとおり、-2は1111110
で表されます。これらすべてのビットを反転すると、0000001
、つまり値1が得られます。
バイナリで見ると役に立ちます。
まず、ご存知のように、負の数は(可能な限り高い符号なしの数に1を引いた値)として表されます。したがって、符号なしの値が最大の65535である16ビット整数の-1は、65536-1 = 65535、つまり16進数では0xffff、2進数では1111 1111 1111 1111
になります。
そう:
バイナリの1 = 0000 0000 0000 0001
すべてのビットで1111 1111 1111 1110
になるわけではありません。これは、10進数で65534です。65536から65534を引いた値は2なので、これは-2です。
Dim mask As Integer = -1
'11111111111111111111111111111111
For x As Integer = -3 To 3
Dim i As Integer = x
Debug.WriteLine("")
Debug.WriteLine("'" & Convert.ToString(i, 2).PadLeft(32, "0"c) & " > Num = " & i.ToString)
i = i Xor mask 'reverse the bits (same as Not)
Debug.WriteLine("'" & Convert.ToString(i, 2).PadLeft(32, "0"c) & " > Not = " & i.ToString)
i += 1 'convert to two's complement
Debug.WriteLine("'" & Convert.ToString(i, 2).PadLeft(32, "0"c) & " > 2's Comp = " & i.ToString)
Next
'debug results
'11111111111111111111111111111101 > Num = -3
'00000000000000000000000000000010 > Not = 2
'00000000000000000000000000000011 > 2's Comp = 3
'11111111111111111111111111111110 > Num = -2
'00000000000000000000000000000001 > Not = 1
'00000000000000000000000000000010 > 2's Comp = 2
'11111111111111111111111111111111 > Num = -1
'00000000000000000000000000000000 > Not = 0
'00000000000000000000000000000001 > 2's Comp = 1
'00000000000000000000000000000000 > Num = 0
'11111111111111111111111111111111 > Not = -1
'00000000000000000000000000000000 > 2's Comp = 0
'00000000000000000000000000000001 > Num = 1
'11111111111111111111111111111110 > Not = -2
'11111111111111111111111111111111 > 2's Comp = -1
'00000000000000000000000000000010 > Num = 2
'11111111111111111111111111111101 > Not = -3
'11111111111111111111111111111110 > 2's Comp = -2
'00000000000000000000000000000011 > Num = 3
'11111111111111111111111111111100 > Not = -4
'11111111111111111111111111111101 > 2's Comp = -3
コンピュータシステムの数値は、2つの補完として保存されます。数が正の場合、正の数の2の補数は同じですが、負の数の場合は異なります。
1.-2-> 1ここで、-2は1110(つまり、-2の補数)としてコンピューターに格納されます。1110の〜は0001になります。0001は正の数であるため、0001(つまり1)としてコンピューターに格納されます。
2.-1-> 0ここで、-1は1111(つまり、-1の2の補数)としてコンピューターに格納されます。1111の〜は0000になります。0000は正の数であるため、0000(つまり0)としてコンピューターに格納されます。
0-> -1ここで、0は0000(つまり2の補数0)としてコンピューターに格納されます。現在、0000の〜は1111です。1111は負の数であるため、0001(ie-1)としてコンピューターに格納されます(MSB以降1111に設定されている場合、数値は負になります)
1-> -2ここで、1は0001としてコンピュータに保存されます(つまり、2の補数1)。これで、0001の〜は1110になります。1110は負の数であるため、0010(ie-2)としてコンピュータに保存されます(MSB以降1110に設定されている場合、数値は負になります)
ほとんどの(すべて?)最新のアーキテクチャでは、 2の補数 を使用して符号付き整数を表します。したがって、ビット単位のNOTは 補体 整数から1を引いたもの。
これは、負の数がビットとして表される方法によるものです。これには最も一般的に 2の補数 が使用されます。
-この表記では、たまたま2は1111110であり、否定されたのは1です。
これは、ビット演算子がWordの各ビットを文字通り反転するためです。これは厳密には算術演算ではなく、論理演算です。
-2 ==%1110、〜-2 ==〜%1110 =%0001 == 1 -1 ==%1111、〜-1 ==〜%1111 =%0000 == 0
等々。
-2から2、および1から-1に移動するには、算術否定演算を使用する必要があります。