45fan.com - 路饭网

搜索: 您的位置主页 > 网络频道 > 阅读资讯:怎么样将2个32位数字表示的10数值转化成字符串?

怎么样将2个32位数字表示的10数值转化成字符串?

2016-09-01 04:05:51 来源:www.45fan.com 【

怎么样将2个32位数字表示的10数值转化成字符串?

#include "stdio.h"
#include "stdlib.h"
#include "memory.h"

#define VEC_MAX_ROW 65
#define VEC_MAX_COL 32

//该函数实现将2个32位数字表示的10进制数值转化成字符串以便打印出来的功能
//如果需要将若干个32位数字表示的10进制数值转化成字符串,同可以在此基础上
//进行简单的扩大展,即可实现, 函数操作成功返回字符串指针,操作失败返回NULL
char* XulToStr(unsigned long ulHigh32, unsigned long ulLow32, char *szStr, int nStrLen)
{
unsigned long ulTmpHigh32 = ulHigh32;
unsigned long ulTmpLow32 = ulLow32;
int nVec[VEC_MAX_ROW][VEC_MAX_COL] = {0};
int nDigit[VEC_MAX_COL] = {0};
int nCarry = 0;
int nBitCount = 0;
int nRowSize = 0;
int nColSize = 0;

//入参有效性检查
if ((NULL == szStr) || (nStrLen < 20))
{ //表示一个64的数字最少需要20位
printf("/r/ncann't output formated string.");
return NULL;
}

//填充算法依赖的一个以2为底的幂数的数字向量表,如:
//2^0 1 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
//2^1 2
//2^2 4
//... ...
//2^32 4294967296 {4, 2, 9, 4, 9, 6, 7, 2, 9, 6}
nVec[0][VEC_MAX_COL - 1] = 1;
nCarry = 0;
for (nRowSize = 1; nRowSize < VEC_MAX_ROW; nRowSize++)
{
for (nColSize = VEC_MAX_COL - 1; nColSize >= 0; nColSize--)
{
nVec[nRowSize][nColSize] = (nVec[nRowSize - 1][nColSize] * 2) % 10;
nVec[nRowSize][nColSize] += nCarry;
nCarry = (nVec[nRowSize - 1][nColSize] * 2) / 10;
//printf("%d", nVec[nRowSize][nColSize]);
}
//printf("/r/n");
}

//将低32位表示的10进制数(也是就一个32位系统所能表示的基本数值范围)
//先转化成一个数字串,后续超出了32位表示的数值的加法操作在此基础上
//进行
nColSize = VEC_MAX_COL - 1;
for (; ulTmpLow32; nDigit[nColSize--] = ulTmpLow32 % 10, ulTmpLow32 /= 10);

//对高32位进行逐位判断,如果某一位为1,则在上面的数字串基础上加上这
//一位以2为底的幂的数字串(数字串存放在向量表中)
if (ulTmpHigh32 > 0)
{
for (nBitCount = 0; nBitCount < 32; nBitCount++)
{
if (ulTmpHigh32 & (1 << nBitCount))
{
for (nColSize = VEC_MAX_COL -1; nColSize >= 0; nColSize--)
{
nDigit[nColSize] += nVec[32 + nBitCount][nColSize];
nDigit[nColSize - 1] += nDigit[nColSize] / 10;
nDigit[nColSize] %= 10;
}
}
}
}

//将计算完成后的数字串的前导数字0全部过滤掉
nColSize = 0;
while (!nDigit[nColSize++]);

//将计算结果的数字串转化为字符串,作为函数输出
for (nColSize--; nColSize < VEC_MAX_COL; nColSize++)
{
*szStr++ = nDigit[nColSize] + '0';
}

return szStr;
}

void main()
{
char szFormatString[100];

memset(szFormatString, '/0', 100);
XulToStr(0xffffffff, 0xffffffff, szFormatString, 100);
printf("%s", szFormatString);

getchar();
return;
}

 

本文地址:http://www.45fan.com/a/question/70545.html
Tags: 数字 2个 32位
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部