web-dev-qa-db-ja.com

ビット単位のNOT演算子の説明

ビットごとのNOT演算子(~ほとんどの言語で)次の値を次のように変換します。

-2 -> 1
-1 -> 0
0 -> -1
1 -> -2

すべきではない-2 に変換 21 に変換 -1など?

19
Maxpm

多くの言語での負の整数の表現については、 2の補数 を参照してください。ご覧のとおり、-2は1111110で表されます。これらすべてのビットを反転すると、0000001、つまり値1が得られます。

24
Phrogz

バイナリで見ると役に立ちます。

まず、ご存知のように、負の数は(可能な限り高い符号なしの数に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です。

11
EboMike
    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
0
dbasnett

コンピュータシステムの数値は、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)としてコンピューターに格納されます。

  1. 0-> -1ここで、0は0000(つまり2の補数0)としてコンピューターに格納されます。現在、0000の〜は1111です。1111は負の数であるため、0001(ie-1)としてコンピューターに格納されます(MSB以降1111に設定されている場合、数値は負になります)

  2. 1-> -2ここで、1は0001としてコンピュータに保存されます(つまり、2の補数1)。これで、0001の〜は1110になります。1110は負の数であるため、0010(ie-2)としてコンピュータに保存されます(MSB以降1110に設定されている場合、数値は負になります)

0
Jay Dabhi

ほとんどの(すべて?)最新のアーキテクチャでは、 2の補数 を使用して符号付き整数を表します。したがって、ビット単位のNOTは 補体 整数から1を引いたもの。

0
user505255

これは、負の数がビットとして表される方法によるものです。これには最も一般的に 2の補数 が使用されます。

-この表記では、たまたま2は1111110であり、否定されたのは1です。

0
BrokenGlass

これは、ビット演算子がWordの各ビットを文字通り反転するためです。これは厳密には算術演算ではなく、論理演算です。

-2 ==%1110、〜-2 ==〜%1110 =%0001 == 1 -1 ==%1111、〜-1 ==〜%1111 =%0000 == 0

等々。

-2から2、および1から-1に移動するには、算術否定演算を使用する必要があります。

0