所以我正在尝试编写代码来减去两个二进制数,但我不确定如何优雅地解决这个问题.保存二进制数的结构如下. 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)
综上所述:
如果两个数字具有相反的符号,则添加幅度.如果两个数字具有相同的符号,则从较大的幅度中减去较小的幅度.然后确定结果的符号.