按位NOT运算符的说明

时间:2010-11-28 05:41:46

标签: bitwise-operators

为什么按位NOT运算符(大多数语言中为~)会转换以下值,如下所示:

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

不应-2转换为21转换为-1等吗?

7 个答案:

答案 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)的形式存储在计算机中

  1. 0-> -1 这里0将作为0000存储在计算机中(即2的0的补数)。现在〜的〜是1111.由于1111是负数,它将存储在计算机中作为0001(ie-1)(因为MSB设置为1111数字将为负)

  2. 1-> -2 这里1将以0001(即2的补数)的形式存储在计算机中。现在0001的〜是1110.由于1110是负数,它将以0010(ie-2)的形式存储在计算机中(因为MSB设置为1110数字将为负)