加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:22:08 所属栏目:百科 来源:网络整理
导读:所以我正在尝试编写代码来减去两个二进制数,但我不确定如何优雅地解决这个问题.保存二进制数的结构如下. typedef struct _bitb { short bit; struct _bitb *nbit;} BitB;typedef struct _bignum { short sign; BitB *bits;} BigNum; 因此,二进制数由包含其绝
所以我正在尝试编写代码来减去两个二进制数,但我不确定如何优雅地解决这个问题.保存二进制数的结构如下.

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)

综上所述:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读