- 注册时间
- 2010-10-22
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 2292
- 在线时间
- 小时
|
楼主 |
发表于 2013-6-13 23:32:49
|
显示全部楼层
基于上面的结构,端午写了个64位的汇编版本,基2^62。api不再有返回错误,(只存在内存申请错,则终止)。内存申请可对齐到指定的字节,默认32字节。
简单做了个64位的static lib 作为与其它语言的调用测试(未严格测试正确性),dll调用起来也容易与kernel32.dll无异:- ;==========================================================================================
- ;mpz_read_radix(a,str,radix)
- ;radix -64 -2~2 64
- ;map="0123456789ABCDEFGHIJKLMNOPQRSTUVWSYZabcdefghijklmnopqrstuvwxyz+/",20h,',',09h,0ah,0dh
- ;最多10+26+26+2=64个有效字符+分隔号5个=69
- ;预扫描终止符:0或'\[code]#include <stdio.h>
- typedef _int64 INT64;
- typedef unsigned _int64 UINT64;
- typedef unsigned char UCHAR;
-
- typedef struct
- {
- UINT64 usd;
- UINT64 alc;
- INT64 sng;
- UINT64 *dat;
- }MP_INT;
-
- void mpz_init(MP_INT *);
- void mpz_read_radix(MP_INT *,UCHAR *str,UINT64 radix);
- void mpz_clear(MP_INT *);
-
- void main()
- {
- UCHAR *str0=" 7,ff ff,ffff,ffff,fff\$";
- UCHAR *str1=" 1,2ab,c03";
- UCHAR *str2=" - 10000000, 000f000fefefadadefe000000f0000000 Asdf00,003 fffffff";
- MP_INT cT0,cT1,cT2;
- UINT64 i=0;
-
- mpz_init(&cT0);
- mpz_init(&cT1);
- mpz_init(&cT2);
-
- mpz_read_radix(&cT0,str0,16);
- mpz_read_radix(&cT1,str1,16);
- mpz_read_radix(&cT2,str2,64);
- printf("\ndat0=");
- for(i=cT0.usd;i>0;i--)
- printf("%016I64X ",cT0.dat[i-1]);
- printf("\ndat1=");
- if(cT1.sng < 0)
- printf("-");
- for(i=cT1.usd;i>0;i--)
- printf("%016I64X ",cT1.dat[i-1]);
- printf("\ndat2=");
- if(cT2.sng < 0)
- printf("-");
- for(i=cT2.usd;i>0;i--)
- printf("%016I64X ",cT2.dat[i-1]);
-
- mpz_clear(&cT0);
- mpz_clear(&cT1);
- mpz_clear(&cT2);
-
- system("pause");
- }
复制代码
mpzlib.zip
(1.26 KB, 下载次数: 7)
;输入串,以0结束或以\$结束:
;str[]="-12abc03";
;str[]=" 1,2ab,c03";
;str[]=" - 1, 2ab,c03\$afdf"; 预扫描有效字符' - 1, 2ab,c03\
;==========================================================================================[/code]
|
|