📜  负二进制数的表示(1)

📅  最后修改于: 2023-12-03 15:28:13.046000             🧑  作者: Mango

负二进制数的表示

负二进制数是一种数值表示法,可以表示有符号整数。

原理

与二进制不同的是,负二进制中的二进制位的权值不是 $2^0, 2^1, 2^2...$,而是 $-2^0, 2^1, -2^2, 2^3...$。

例如,$11010$ 表示的数值为 $-2^0 + 2^1 - 2^3 = -1$。

负二进制数的加法和减法与二进制是类似的,只需增加一些特殊情况的处理。

负二进制的表示

负二进制数可以使用两种方法表示:

1. 舍入表示法

在负二进制数的舍入表示法中,每个数位的值只能是 $-1,0,1$ 中的一个。舍入过程是将余数从右至左逐位处理,当余数为负数时,将其向左进位,当余数为正数时,将其保留为该位的值。最后的结果即为负二进制数。

例如,$-11$ 在舍入表示法中表示为 $11010$,因为:

$$-11=(-1)\times(-2)^4 + 1\times2^3 + 0\times(-2)^2 + 1\times2^1 + 0\times(-2)^0$$

2. 附加编码表示法

在负二进制数的附加编码表示法中,除了 $-1,0,1$ 之外,还可以使用 $+2,-2$。该方法可以在不舍入的情况下,表示任何负二进制数。但是,在该表示法中,一个数值可能有多种表示方法。

例如,$-11$ 在附加编码表示法中可以表示为:

$$-11=+2\times(-2)^3 -1\times(-2)^2 + 1\times(-2)^0$$

$$-11=-1\times(-2)^4 + 1\times2^3 + 1\times(-2)^2 - 1\times2^1 + 1\times(-2)^0$$

负二进制的加法和减法

负二进制数的加法和减法与二进制是类似的,但需要特殊处理溢出、进位和借位。

加法
  1. 将两个数值对齐,如果位数不同,则在前面补 0。
  2. 从右至左逐位相加,如果某位加和为 $2$ 或 $-2$,则将进位或借位到下一位。
  3. 如果最高位发生进位,则结果为正数,需要在前面增加一位。

例如,计算 $1011_2+110_2$:

     1011
+     110
-------
  1 0001

因此,$1011_2+110_2=10001_2$,即 $-3+4=1$。

减法

为了使减法可以使用加法来实现,需要将被减数取负后和减数相加。

例如,计算 $1011_2-110_2$:

         1011
+  1 0100 (110 取负)
---------
   1 1111

因此,$1011_2-110_2=-1111_2$,即 $-3-2=-5$。

代码实现

负二进制表示法的实现需要针对具体情况进行特殊处理。以下是 Python 语言的一个实现示例。

def to_negabinary(n):
    if n == 0:
        return '0'
    bits = []
    while n != 0:
        if n % 2 == 0:
            bits.append('0')
            n //= -2
        else:
            bits.append('1')
            if n > 0:
                n = -n - 1
            else:
                n = -n
    return ''.join(bits[::-1])

def from_negabinary(s):
    n = 0
    for i, b in enumerate(s[::-1]):
        if b == '1':
            if i % 2 == 0:
                n += 2**i
            else:
                n -= 2**i
    return n

其中,to_negabinary(n) 将一个十进制整数转换为负二进制数,from_negabinary(s) 将一个负二进制数转换为十进制整数。