📅  最后修改于: 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,0,1$ 中的一个。舍入过程是将余数从右至左逐位处理,当余数为负数时,将其向左进位,当余数为正数时,将其保留为该位的值。最后的结果即为负二进制数。
例如,$-11$ 在舍入表示法中表示为 $11010$,因为:
$$-11=(-1)\times(-2)^4 + 1\times2^3 + 0\times(-2)^2 + 1\times2^1 + 0\times(-2)^0$$
在负二进制数的附加编码表示法中,除了 $-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$$
负二进制数的加法和减法与二进制是类似的,但需要特殊处理溢出、进位和借位。
例如,计算 $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)
将一个负二进制数转换为十进制整数。