当前位置 : 主页 > 编程语言 > c++ >

减去没有二进制补码的带符号二进制数

来源:互联网 收集:自由互联 发布时间:2021-06-23
所以我正在尝试编写代码来减去两个二进制数,但我不确定如何优雅地解决这个问题.保存二进制数的结构如下. typedef struct _bitb { short bit; struct _bitb *nbit;} BitB;typedef struct _bignum { short sign
所以我正在尝试编写代码来减去两个二进制数,但我不确定如何优雅地解决这个问题.保存二进制数的结构如下.

typedef struct _bitb {
    short bit;
    struct _bitb *nbit;
} BitB;
typedef struct _bignum {
    short sign;
    BitB *bits;
} BigNum;

因此,二进制数由包含其绝对值的位列表表示,从LSB到MSB,然后是表示该数字是正还是负的短路(它是任意精度算术的实现).如何在没有两个补码的情况下从另一个中减去一个数字?

在有人要求之前,这是针对学校的,但我不想在代码中使用解决方案,只需要我可以实现的通用算法.我一直在寻找,似乎没有一个好的算法可以解决一般情况.我是否需要检查数字的符号,然后为所有可能的情况实施代码(负负正,正负负,正负正,负负正)?或者我应该转换为2的补码?

您可以将问题减少到两种情况:相反的迹象和相同的迹象.

减去具有相反符号的数字需要添加两个绝对值.例子:

(-7) - (+5) = -(7+5)
(+7) - (-5) = +(7+5)

要减去具有相同符号的数字,您需要从较大的绝对值中减去较小的绝对值.例子:

(+7) - (+5) = +(7-5)
(+7) - (+9) = -(9-7)
(-7) - (-5) = -(7-5)
(-7) - (-9) = +(9-7)

正如您所看到的,结果的符号实际上有六种情况,如下所示(其中X,Y和Z是数字的大小).

(-X) - (+Y) ==> -(Z)
(+X) - (-Y) ==> +(Z)
(+X) - (+Y) and (X >= Y) ==> +(Z)
(+X) - (+Y) and (X <  Y) ==> -(Z)
(-X) - (-Y) and (X >  Y) ==> -(Z)
(-X) - (-Y) and (X <= Y) ==> +(Z)

综上所述:

如果两个数字具有相反的符号,则添加幅度.如果两个数字具有相同的符号,则从较大的幅度中减去较小的幅度.然后确定结果的符号.

网友评论