| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4073 人关注过本帖
标题:[原创]高精度运算函数库(大整数运算)[位运算和指针的运用]
取消只看楼主 加入收藏
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
/*himuti: a=a*b */ void himuti(hinum *a,hinum *b) {int i,v,j,max1; char *p; hinum ans,*ansp,b1,*b1p; ansp=&ans;b1p=&b1;/*得到地址*/ hifirst(ansp);/*ans=0*/ higive1(b1p,b);/*b1=b*/ p=b1.num; if(v=hichk(a))hichg(a); if(hichk(b1p)){v=!v;hichg(b1p);}/*检查符号位并记录结果的符号位,如果为负换为它的相反数*/ max1=hicount(b);/*max1=b的值为1的最高位*/ for(i=0;i<=max1;i++) /*二进制乘法,类似于笔算竖式*/ {if((p[i>>3]>>(i&7))&1)hiadd(ansp,a);/*取出高精度数b的第i位,判断是否为1,为1则ans=ans+a*/ hileft1(a); /*a左移一位*/ } if(v)hichg(ansp);/*结果为负*/ higive1(a,ansp); } /*hidiv: mod=a%b(a mod b),a=a/b*/ int hidiv(hinum *a,hinum *b,hinum *mod) {int i,v,max1,max2,flag; char *p; hinum ans,*ansp,b1,*b1p; ansp=a;b1p=&b1; /*得到地址*/ higive1(b1p,b); higive1(mod,a); hifirst(ansp); if(v=hichk(mod))hichg(mod); if(hichk(b)){v=!v;hichg(b1p);}/*检查符号位并记录结果的符号位,如果为负换为它的相反数*/ max1=hicount(mod); max2=hicount(b1p);/*取出位数*/ if(max1<max2){return 0;}/*除数的位数比被除数大*/ max1=max1-max2; hileft(b1p,max1);/*数据对齐*/ flag=0; for(i=0;i<max1;i++)/*加减交替法*/ {if(flag)hiadd(mod,b1p);/*flag=1:mod=mod-b1*/ else hicut(mod,b1p); /*flah=0:mod=mod+b1*/ flag=hichk(mod); /*mod>=0:flag=0;else:flag=1*/ hileft1(ansp); /*ans=ans<<1*/ if(!flag)hiadd1(ansp); /*flag=0:ans=ans+1*/ hiright1(b1p); /*b1=b1>>1*/ } if(flag)hiadd(mod,b1p); else hicut(mod,b1p); flag=hichk(mod); hileft1(ansp); if(!flag)hiadd1(ansp);/*和循环体比少了hiright1*/ while(hichk(mod))/*求余数*/ hiadd(mod,b1p); if(v)hichg(ansp);/*结果为负*/ return 0;} /*oprate:运算函数,c为运算符号;对于'+','-','*':v=0结果存在a中,否则新见建一个结果空间,对于'/',a=a/b,返回余数*/ hinum *hioprate(hinum *a,hinum *b,char c,int v) {hinum *p; if(c=='/')/*除法*/ {p=hinew(1); hidiv(a,b,p); return p;} if(v){p=hinew(0);higive1(p,a);}/*需要新建结果空间*/ else p=a;if(c=='+')hiadd(p,b); if(c=='-')hicut(p,b); if(c=='*')himuti(p,b); return p;} /****测试函数****/ /*hishow: 显示a的二进制*/ void hishow(hinum *a) {int x,i,j;char *p; p=a->num;for(i=MAXSIZE;i;i--){for(j=8;j;j--) {x=(p[i-1]>>(j-1))&1; printf("%d",x); } printf(","); } printf("\n");} /*****************************************************/

[此贴子已经被作者于2005-4-9 17:01:36编辑过]


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 16:55
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
这是一个头文件

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 16:56
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
我没写main()这是一个头文件,我输入的十进制大乘数是用 char数组以二进制补码的形式存放的(类似于整形数据)一开始我定义了一个结构体(hinum)

[此贴子已经被作者于2005-4-9 17:04:39编辑过]



我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 17:03
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
a是字符串,至于怎么转换补码看give2,3函数

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 18:20
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
我已经尽力加注释了……

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 19:48
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
谢谢knocker

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 19:53
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
格式化后更新了,可是醒目灯……

[此贴子已经被作者于2005-4-9 20:08:04编辑过]



我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 20:04
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
空前是用十进制的阿,不错的程序

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-11 17:14
快速回复:[原创]高精度运算函数库(大整数运算)[位运算和指针的运用]
数据加载中...
 
   



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

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