代码之家  ›  专栏  ›  技术社区  ›  Maxpm

按位NOT运算符的说明

  •  17
  • Maxpm  · 技术社区  · 15 年前

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

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

    不应该 -2 转换为 2 , 1 转换为 -1 等等。?

    7 回复  |  直到 15 年前
        1
  •  26
  •   Phrogz    15 年前

    见 two's complement 在许多语言中表示负整数。如您所见,-2由 1111110 ;如果你把得到的所有比特都颠倒过来 0000001 ,即值1。

        2
  •  12
  •   netok EboMike    7 年前

    如果你用二进制来看它会有帮助。

    首先,如您所知,负数表示为(最大可能的无符号数加1负数)。16位整数中的-1(最高无符号值为65535)将是65536-1=65535,即十六进制的0xffff,或 1111 1111 1111 1111 二进制的。

    所以:

    二进制1= 0000 0000 0000 0001

    不是所有位都会导致 1111 1111 1111 1110 . 十进制数是65534。65536减去65534等于2,所以这是-2。

        3
  •  0
  •   BrokenGlass    15 年前

    这是因为负数是如何表示为位的。最常见的情况是 Two's Complements 使用。

    -在这个符号中,2恰好是111111 0,它的负数是1

        4
  •  0
  •   Peter G. McDonald    15 年前

    这是因为按位运算符逐字反转单词中的每个位。 它不是严格意义上的算术运算,而是逻辑运算。

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

    等等。

    要从-2转到2,从1转到-1,需要使用算术求反运算。

        5
  •  0
  •   dbasnett    15 年前
        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
  •   Nisse Engström sting_roc    9 年前

    大部分(全部?)现代建筑使用 two's complement 表示有符号整数。因此,按位不等于 补语 整数减去1。

        7
  •  0
  •   Jay Dabhi    7 年前

    计算机系统中的数字以两个互补的形式存储。 如果数字是正数,那么正数的两个补数是相同的,但是负数的补数是不同的。

    1.-2->1个 这里-2将作为1110(即-2的补码)存储在计算机中。现在1110的~是0001。因为0001是正数,所以它将作为0001(即1)存储在计算机中

    2.-1->0个 这里-1将作为1111存储在计算机中(即-1的2的补码)。现在1111的~是0000。因为0000是正数,所以它将作为0000(即0)存储在计算机中

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

    2. 1->-2 这里1将作为0001存储在计算机中(即1的2补码)。现在0001的~是1110。因为1110是负数,所以它将作为0010(即-2)存储在计算机中(因为MSB设置为1110,所以该数字将为负数)