| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4073 人关注过本帖
标题:[原创]高精度运算函数库(大整数运算)[位运算和指针的运用]
只看楼主 加入收藏
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
 问题点数:0 回复次数:33 
[原创]高精度运算函数库(大整数运算)[位运算和指针的运用]

会一点点C,自己写的,花了一个星期的零碎时间,运用了二进制储存而不是一般的一个char存十进制数,拿出来学习交流一下(相信对位运算和指针这两个C的精华的理解有一点点帮助)
jBcmbVAg.rar (9.64 KB) [原创]高精度运算函数库(大整数运算)[位运算和指针的运用]



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




d3uOXxfR.rar (9.32 KB) [原创]高精度运算函数库(大整数运算)

搜索更多相关主题的帖子: 指针 整数 函数库 二进制 高精度 
2005-04-07 22:21
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
htm 是我用WINT-TC导出的,看起来会比在TC里面看舒服(如果你是用TC的话)

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

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-08 18:20
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
……没人回个贴支持一下吗?

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 16:27
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
我支持,但是我在网吧不能下载,没法看你的杰作了,能不能把源码发出来?

2005-04-09 16:33
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
你什么存放二制?

char 还是 int ?

2005-04-09 16:34
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
/*高精度函数库,利用补码储存,学习了一般整型算术运算的一些算法*/ /*为了提高效率,运用了比较多的位运算,可能影响可读性,我尽量加了注释*/ /*相关位运算语句: 左移<< ,右移>>,按位或|,按位且&,非~*/ /*函数依赖关系:算术辅助函数和赋值及输入输出函数的前5个是基础函数,其它函数依赖于这些函数*/ /*写这个的目的是大家学习交流,也欢迎批评指正和提出建议。作者:乌鸦丘比特,crow262626@yahoo.com.cn;版权没有,盗版不究*/ /*一些常用的位运算:X&二进制数1111:N个1就是提取前N位,或者说求X除以2^N的余数;X>>(Y-1)&1: 提取第Y位;X>>Y:X/(2^Y)*/ #include <stdio.h> /**************数据及一些相关常量定义****************/ #define MAXSIZE 10#define WITH 255 /*MAXSIZE: 高精度的最大值决定量,一个高精度数占MAXISIZE个字节*/ /*WITH: 二进制为连续8个1,用来取某个数的前8位和从char中取出前8位给int并防止负数高位补1*/typedef struct hinum{char num[MAXSIZE];}hinum; /**************函数说明*****************/ /*赋值及输入输出函数*/ void hifirst(hinum *a);/*初始化a为0*/ hinum *hinew(int v);/*新建一个高精度空间并初十化为0,v=0则不初始化*/ void hidel(hinum *p);/*删除一个高精度空间*/ void higive0(hinum *dest,long number);/*整数->高精度*/ void higive1(hinum *dest,hinum *a);/*高精度->高精度*/ int higive2(hinum *dest,char *str);/*字符串->高精度,错误返回0*/ void higive3(char *str,hinum *a);/*高精度->字符串*/ int higets(hinum *dest);/*从键盘输入dest,错误返回0*/ void hiprint(hinum *dest);/*打印dest*/ /*算术运算辅助函数*/ void hileft(hinum *a,int step);/*a=a<<step*/ int hileft1(hinum *a);/*a=a<<1,返回原数最高位*/ int hiright1(hinum *a);/*a=a>>1,返回原数最低位*/ void hichg(hinum *a);/*a=-a*/ int hichk(hinum *a);/*if(a>=0)return 0;else return 1;*/ int hicount(hinum *a);/*返回a值为1的最高位*/ /*算术及比较运算函数*/ int hicmp(hinum *a,hinum *b);/*a>b返回1,a=b返回0,a<b返回-1*/ void hiadd1(hinum *a);/* a++ */ void hiadd0(hinum *a,long b);/*a=a+b*/ void hiadd(hinum *a,hinum *b);/*a=a+b*/ void hicut(hinum *a,hinum *b);/*a=a-b*/ void himuti(hinum *a,hinum *b);/* a=a*b */ int hidiv(hinum *a,hinum *b,hinum *mod);/*mod=a%b(a mod b),a=a/b*/ hinum *hioprate(hinum *a,hinum *b,char c,int v); /*运算函数,c为运算符号:'+','-','*','/';对于'+','-','*':v=0结果存在a中,否则新见建一个结果空间,对于'/',a=a/b,返回余数*/ /****测试函数****/ void hishow(hinum *a);/*显示a的二进制*/

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


我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 16:37
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
原来解释太多也不好……

2005-04-09 16:39
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
是论坛的BUG?,出现好几次了,贴代码要从新编辑……要不然没换行……
我是用char 存的

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-09 16:41
乌鸦丘比特
Rank: 1
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
/*****************************具体函数************************************/ /********赋值及输入输出函数********/ /*hifirst: 初始化a为0*/ void hifirst(hinum *a) {char *p; int i; p=a->num; for(i=0;i<MAXSIZE;i++)p[i]=0; } /*hinew: 新建一个高精度空间并初十化为0,v=0则不初始化*/ hinum *hinew(int v) {hinum *p; p=(hinum*)malloc(MAXSIZE); if(v)hifirst(p); return p; } /*hidel: 删除一个高精度空间*/ void hidel(hinum *p) {free(p); } /*higive0: 整数->高精度*/ void higive0(hinum *dest,long number) {int i,v=0; if(number<0)v=1; for(i=0;i<4;i++) {(dest->num)[i]=number&WITH;/*把long分为4个8位,分别取出放在a[0],a[1],a[2],a[3]*/ number=number>>8; }if(v) {for(i=4;i<MAXSIZE;i++) /*按照数的正负剩下的每位补0或1*/ (dest->num)[i]=~0; }else for(i=4;i<MAXSIZE;i++) (dest->num)[i]=0;} /*higive1: 高精度->高精度*/ void higive1(hinum *dest,hinum *a) {int i; char *p1,*p2; p1=dest->num; p2=a->num; for(i=0;i<MAXSIZE;i++) p1[i]=p2[i]; } /*higive2: 字符串->高精度,错误返回0*/ int higive2(hinum *dest,char *str) {int v; hinum tmp,*tmpp; tmpp=&tmp; if(str[0]=='-'){v=1;str++;} else v=0; hifirst(dest); while((*str)!='\0') {hileft1(dest); higive1(tmpp,dest); hileft(tmpp,2); hiadd(dest,tmpp);/*dest=dest*10:dest=(dest<<3)+(dest<<1)*/ if((*str)<'0'||(*str)>'9')return 0;/*出现非数字字符*/ hiadd0(dest,((*str)-'0')); str++;} if(v)hichg(dest);/*如果dest应该为负*/ return 1;} /*higive3: 高精度->字符串*/ void higive3(char *str,hinum *a) {char tmp[MAXSIZE*3],*number; int i; hinum temp,*tempp,ten,*tenp,mod,*modp,zero,*zerop; tempp=&temp;tenp=&ten;modp=&mod;zerop=&zero;/*取地址*/ higive1(tempp,a);/*temp=a*/ higive0(tenp,10);/*ten=10*/ hifirst(zerop); /*zero=0*/ if(hichk(a)) /*如果a为负*/ {hichg(tempp);(*str)='-';str++;} number=modp->num; i=0; if(!hicmp(tempp,zerop))tmp[i++]='0'; while(hicmp(tempp,zerop))/*除10取余,直到temp=0*/ {hidiv(tempp,tenp,modp); tmp[i++]=(*number)+'0'; }while(i--){*str=tmp[i]; str++;} *str='\0'; } /*higets :从键盘输入dest,错误返回0*/ int higets(hinum *dest) {char tmp[MAXSIZE*3]; if(scanf("%s",tmp)!=1)return 0;/*输入错误*/ if(higive2(dest,tmp))return 1;/*把字符串转换为高精度*/ return 0;/*输入非数字字符串*/ } /*hiprint: 打印dest*/ void hiprint(hinum *dest) {char tmp[MAXSIZE*3]; higive3(tmp,dest);/*把高精度转换为字符串*/ printf("%s",tmp);}

[此贴子已经被作者于2005-4-9 16:48:58编辑过]


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



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

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