为什么按位NOT运算符(大多数语言中为~
)会转换以下值,如下所示:
-2 -> 1
-1 -> 0
0 -> -1
1 -> -2
不应-2
转换为2
,1
转换为-1
等吗?
答案 0 :(得分:23)
有关多种语言中负整数的表示,请参阅two's complement。如您所见,-2由1111110
表示;如果您将所有这些位反转,则会得到0000001
,即值为1.
答案 1 :(得分:10)
如果以二进制文件查看它会有所帮助。
首先,如您所知,负数表示为(最高可能的无符号数加1减去值)。因此,16位整数中的-1(无符号值最高为65535)为65536-1 = 65535,即十六进制为0xffff,二进制为1111 1111 1111 1111
。
所以:
1 in binary = 0000 0000 0000 0001
不是所有位都会导致1111 1111 1111 1110
。以十进制表示的是65534.而65536减去65534是2,所以这是-2。
答案 2 :(得分:0)
大多数(所有?)现代架构使用two's complement来表示有符号整数。因此,按位NOT是整数减去1的补码。
答案 3 :(得分:0)
这是由于负数如何表示为位。为此,最常使用Two's Complements。
在这种表示法中,-2恰好是1111110,否定是1
答案 4 :(得分:0)
这是因为逐位运算符逐字地反转字中的每个位。 它不是严格的算术运算,而是逻辑运算。
-2 ==%1110,〜-2 ==〜%1110 =%0001 == 1 -1 ==%1111,〜-1 ==〜%1111 =%0000 == 0
等等。
要从-2到2,从1到-1,您需要使用算术否定操作。
答案 5 :(得分: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
答案 6 :(得分:0)
计算机系统中的数字存储为2的补码。 如果数字为正,则正数的2个补码相同。但对于负数,则不同。
1.-2-> 1 在这里-2将以1110的形式存储在计算机中(即2的补码-2)。现在1110的〜是0001.由于0001是正数,它将以0001(即1)形式存储在计算机中
2.-1-> 0 这里-1将以1111的形式存储在计算机中(即-1的2的补数)。现在1111的〜是0000.由于0000是正数,它将以0000(即0)的形式存储在计算机中
0-> -1 这里0将作为0000存储在计算机中(即2的0的补数)。现在〜的〜是1111.由于1111是负数,它将存储在计算机中作为0001(ie-1)(因为MSB设置为1111数字将为负)
1-> -2 这里1将以0001(即2的补数)的形式存储在计算机中。现在0001的〜是1110.由于1110是负数,它将以0010(ie-2)的形式存储在计算机中(因为MSB设置为1110数字将为负)