问题
Why is it that the bitwise NOT operator (~
in most languages) converts the following values like so:
-2 -> 1
-1 -> 0
0 -> -1
1 -> -2
Shouldn't -2
convert to 2
, 1
convert to -1
, etc.?
回答1:
See two's complement for the representation of negative integers in many languages. As you can see, -2 is represented by 1111110
; if you invert all those bits you get 0000001
, i.e. a value of 1.
回答2:
It helps if you look at it in binary.
First of all, as you know, negative numbers are expressed as (highest possible unsigned number plus 1 minus value). So -1 in a 16-bit integer, which has the highest unsigned value of 65535, would be 65536-1=65535, i.e. 0xffff in hex, or 1111 1111 1111 1111
in binary.
So:
1 in binary = 0000 0000 0000 0001
NOT on all bits would result in 1111 1111 1111 1110
. That, in decimal, is 65534. And 65536 minus 65534 is 2, so this is -2.
回答3:
This is due to how negative numbers are represented as bits. For this most commonly Two's Complements are used.
-2 happens to be 1111110 in this notation, which negated is 1
回答4:
This is because the bit-wise operator literally inverts each bit in the word. It is NOT strictly an arithmetic operation, it is a logic operation.
-2 == %1110, ~-2 == ~%1110 = %0001 == 1 -1 == %1111, ~-1 == ~%1111 = %0000 == 0
and so on.
To go from -2 to 2, and 1 to -1 you need to use the arithmetic negation operation.
回答5:
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
回答6:
Most (all?) modern architectures use two's complement to represent signed integers. The bitwise NOT is thus the complement of the integer minus one.
回答7:
The numbers in computer systems are stored as 2 complementary. If number is positive then 2 complement of positive number is same.But for the negative number it is different.
1.-2 -> 1 Here -2 will be stored in computer as 1110(i.e. 2's complement of -2).Now ~ of 1110 is 0001.As 0001 is positive number it will be stored in computer as 0001(i.e.1)
2.-1 -> 0 Here -1 will be stored in computer as 1111(i.e. 2's complement of -1).Now ~ of 1111 is 0000.As 0000 is positive number it will be stored in computer as 0000(i.e.0)
0 -> -1 Here 0 will be stored in computer as 0000(i.e. 2's complement of 0).Now ~ of 0000 is 1111.As 1111 is negative number it will be stored in computer as 0001(i.e.-1)(since MSB is set for 1111 the number will be negative)
1 -> -2 Here 1 will be stored in computer as 0001(i.e. 2's complement of 1).Now ~ of 0001 is 1110.As 1110 is negative number it will be stored in computer as 0010(i.e.-2)(since MSB is set for 1110 the number will be negative)
来源:https://stackoverflow.com/questions/4295578/explanation-of-bitwise-not-operator