为什么按位NOT运算符(大多数语言中的~
)会这样转换以下值:
-2 -> 1
-1 -> 0
0 -> -1
1 -> -2
是否应该将-2
转换为2
,将1
转换为-1
,等等?
发布于 2010-11-28 13:44:18
有关负整数在许多语言中的表示,请参阅two's complement。正如您所看到的,-2由1111110
表示;如果您反转所有这些位,您将得到0000001
,即值1。
发布于 2010-11-28 13:46:45
如果你以二进制的形式来看它,它会有所帮助。
首先,正如您所知道的,负数表示为(最大可能的无符号数加上1减去的值)。因此,在16位整数中,具有最高无符号值65535的-1将是65536-1=65535,即十六进制的0xffff或二进制的1111 1111 1111 1111
。
所以:
二进制形式的1= 0000 0000 0000 0001
不是在所有位上都会导致1111 1111 1111 1110
。用十进制数表示是65534。65536减65534等于2,所以这是-2。
发布于 2010-11-29 05:03:43
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
https://stackoverflow.com/questions/4295578
复制相似问题