标题:[求]二进制的加法、乘法、除法程序
只看楼主
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
unsigned short binaryinput(void)
{
    char ch[17];
    int i;
    unsigned short x=0;
    scanf("%s",ch);
    for(i=0;i<strlen(ch);i++)
    {
        x+=(ch[i]-48);
        x*=2;
    }
    return x;
}
2008-09-21 16:43
yzwang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-9-21
得分:0 
谢谢!
2008-09-21 17:50
yzwang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-9-21
得分:0 
看不懂  
for(i=0;i<strlen(ch);i++)
    {
        x+=(ch[i]-48);
        x*=2;
    }这个是怎么实现两个数的相加的?怎么进位的呢?
2008-09-21 18:06
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
晕,咋这么想不开呢
那个仅仅是输入了一个二进制数,不是什么相加
输入完了以后用加号往一块加就行了

unsigned short a,b,c;
a=binaryinput();
b=binaryinput();
c=a+b;
------就这么加
2008-09-21 19:33
ml232528
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:367
专家分:879
注 册:2007-7-23
得分:0 
先转换成十进制 再相加 再转换成二进制输出
乘除同理

-︻┻┳═一 ☆ 悲伤的代价就是让自己明白什么是最重要的和应该珍惜的
2008-09-21 20:49
yzwang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-9-21
得分:0 
我的意思是输入的是十进制的数,通过程序先转换成二进制的,然后再用二进制的加法。
2008-09-22 20:20
hgrhgy
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2008-9-22
得分:0 
结构体做成链表的,节点存放值与进位。。
如果你的数不很长的话这样应该就可以了。如果太长则考虑当前32位CPU的加法中32位相加和1位相加所耗的时间其实是相等的。这就考虑如何将节点中的进位进行调整。
2008-09-22 20:51
yzwang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-9-21
得分:0 
加法 BN_Add
输入:a,b
输出:c=a+b
1.  c=0
2.  for i=0 up to RSA BNwordlen
  2.1  carry=a[i]+b[i]+carry
  2.2  c[i]=(word)carry
  2.3  carry=carry>>32
3.  end for
4.  c[i]=carry
5.  return
乘法
输入:a,b  a=am…a0,b=bn…b0
输出:c=a*b
1.  c=0
2.  carry=0  unsigned int 64
3.  for i=0 up to m
  3.1 for j=0 up to n
    3.1.1 carry=carry+ai*bj
    3.1.2 c[i+j]=(word)carry+Ci+j
    3.1.3 carry=carry>>32
  3.2 end for
4.  end for
5.  return c
上面是二进制数的加法和除法的算法,我没看懂,请高人指点一下哦,越详细越好。谢谢啦!
2008-09-22 22:57
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
那你还说16位以内?
你写的这个一般来说是1024位甚至更长的数据类型的运算。
不要执著于二进制什么的,我早就说过,机器内部自动都是二进制,不用你管的。

你写的这个流程的意图就是把1024位或者更长的数值分割成32位的单元以便在32位机器上进行计算。这个流程说白了就是模仿小学时候的竖式计算,用carry记录进位,你就认为a[i],b[i]这些东西是大数里面的某位数字就可以了。
2008-09-23 00:20
yzwang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2008-9-21
得分:0 
你说的我大体上都知道,就是具体的细节不明白,比如
(word)carry   carry=carry>>32是什么意思呢?我很菜的,望解释的更详细些,谢谢!
2008-09-23 12:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-234384-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.068877 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved