2010-11-28 10 views
11

Warum ist es, dass die bitweise NOT-Operator (~ in den meisten Sprachen), so dass die folgenden Werte wie konvertiert:Erklärung der bitweiser NOT-Operator

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

Sollte nicht -2 konvertieren in 2, 1 konvertieren in -1 usw.?

+0

Nachtrag: nützlich zu beachten, dass 'bitweise NOT' fast immer ist die schnellste einen String in eine Zahl zu analysieren: https://jsperf.com/number-vs-plus-vs-toint-vs-tofloat/20 –

Antwort

16

Siehe two's complement für die Darstellung negativer Ganzzahlen in vielen Sprachen. Wie Sie sehen können, wird -2 durch 1111110 dargestellt; Wenn Sie alle diese Bits invertieren, erhalten Sie 0000001, d. h. einen Wert von 1.

0

Die meisten (alle?) modernen Architekturen verwenden two's complement, um vorzeichenbehaftete Ganzzahlen darzustellen. Das bitweise NOT ist also das Komplement der ganzen Zahl minus Eins.

10

Es hilft, wenn Sie es im Binärformat betrachten.

Zuerst, wie Sie wissen, werden negative Zahlen ausgedrückt als (höchstmögliche vorzeichenlose Zahl plus 1 minus Wert). So wäre -1 in einer 16-Bit-Ganzzahl, die den höchsten vorzeichenlosen Wert von 65535 hat, 65536-1 = 65535, d. H. 0xffff in Hex, oder 1111 1111 1111 1111 binär.

So:

1 in binär = 0000 0000 0000 0001

nicht auf allen Bits würden in 1111 1111 1111 1110 führen. Das ist in Dezimal 65534. Und 65536 minus 65535 ist 1, also ist das -1.

0

Dies liegt daran, wie negative Zahlen als Bits dargestellt werden. Hierfür werden am häufigsten Two's Complements verwendet.

-2 1111110 geschieht in dieser Notation zu sein, das negierte 1

0

Dies, da der bitweise Operator buchstäblich jedes Bit in dem Wort invertiert. Es ist NICHT streng eine arithmetische Operation, es ist eine logische Operation.

-2% == 1110 ~ -2 == ~% 1110% 0001 = 1 == == -1% 1111, ~ -1 == ~% 1111% 0000 = == 0

und so weiter.

Um von -2 zu 2 und von 1 zu -1 zu wechseln, müssen Sie die arithmetische Negation verwenden.

0
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 
Verwandte Themen