超长整数的基础运算 算法实现之进制转换篇
2014-11-22 16:35
736 查看
十进制转二进制
由于单个“位”采用的是216-1作为理论最大值,因此在本次大整数的表示过程中每个类似“十进制”位可采用16位的二进制来表示,符号位单独表示。
“十”进制转换成二进制,实际上是经过中间状态(即大整数的逻辑存储表示)转化。在转换过程中大整数的每个“位”无耦合,不存在依赖关系,因此实现方式较为单一,即采用十进制数进行不断除2得余数的方式组成二进制的结果。需要特别注意的是二进制字符串不足16位的需要在高位用“0”补齐至16位。
由于遍历大整数(从低位开始)表示的关系(整数的高位在数组下标的高位),所以对得出结果的二进制字符串进行整体反转。为了一般表示的需要,如果翻转后串的左边起始字符对零进行过滤,因为这些零没有实际意义。
实现原理先将字符串从右至左分割成16个固定字符长度的段,如果最后不足16位的不需要补齐,因为遍历二进制字符串时,当超出字符串长度时不会再继续遍历,因此不会有溢出的情况。设定一个反复计数器,对达到16位后的段进行和累加,并用大整数设定当前的表示位为累加的和,并且复位计数器(置0)。最后一组16个字符串(可能不足16位),根据实际的长度遍历到最后一个字符(肯定是1)为止。
小结:
关于超长整数的基本运算全部介绍完毕,后续会将用到的私有函数(输入、输出、移位、赋值、交换等)贴出,敬请关注!
由于单个“位”采用的是216-1作为理论最大值,因此在本次大整数的表示过程中每个类似“十进制”位可采用16位的二进制来表示,符号位单独表示。
“十”进制转换成二进制,实际上是经过中间状态(即大整数的逻辑存储表示)转化。在转换过程中大整数的每个“位”无耦合,不存在依赖关系,因此实现方式较为单一,即采用十进制数进行不断除2得余数的方式组成二进制的结果。需要特别注意的是二进制字符串不足16位的需要在高位用“0”补齐至16位。
由于遍历大整数(从低位开始)表示的关系(整数的高位在数组下标的高位),所以对得出结果的二进制字符串进行整体反转。为了一般表示的需要,如果翻转后串的左边起始字符对零进行过滤,因为这些零没有实际意义。
// 十进制转换为二进制 char* decToBinHBInt(HBigInt* src){ char *res; un_short cur_num; long index; int j; // 符号位 + 字符串结束符'\0',所以+2 res = (char *)malloc(sizeof(char)*(src->length*BIT_PRE_WORD+2)); memset(res,'\0',sizeof(char)*(src->length*BIT_PRE_WORD+2)); for(index=0; index < src->length; index++) { cur_num = src->pBigInt[index]; for(j=0; j<BIT_PRE_WORD;j++){ res[index*BIT_PRE_WORD+j]=(char)((cur_num & 0x1)+48); // +48是为了做asc码转化 cur_num >>= 1; } } if(src->sign == -1) { res[index*BIT_PRE_WORD]='-'; res[index*BIT_PRE_WORD+1]='\0'; } else res[index*BIT_PRE_WORD]='\0'; reverStr(res); // 倒序字符串 trimLeft(res); // 左边无意义的“0”字符,直至字符“1”出现 return res; }二进制转化十进制
实现原理先将字符串从右至左分割成16个固定字符长度的段,如果最后不足16位的不需要补齐,因为遍历二进制字符串时,当超出字符串长度时不会再继续遍历,因此不会有溢出的情况。设定一个反复计数器,对达到16位后的段进行和累加,并用大整数设定当前的表示位为累加的和,并且复位计数器(置0)。最后一组16个字符串(可能不足16位),根据实际的长度遍历到最后一个字符(肯定是1)为止。
// 二进制转换为十进制 int binToDecHBInt(char* bin, HBigInt* src){ char *res; un_short cur_num=0; long index,str_len; int i=0,j=0; trimLeft(bin); res = bin; str_len = strlen(bin); extendHBInt(src,str_len/BIT_PRE_WORD + 1); for(index=str_len-1; index >= 0; index--) { cur_num += ((res[index]-48) << j); if (0 == (j+1)%BIT_PRE_WORD) { src->pBigInt[i++] = cur_num; j=0; cur_num=0; continue; } j++; } if(str_len%BIT_PRE_WORD) src->pBigInt[i++] = cur_num; src->length = i; return RETURN_OK_BINT; }
小结:
关于超长整数的基本运算全部介绍完毕,后续会将用到的私有函数(输入、输出、移位、赋值、交换等)贴出,敬请关注!
相关文章推荐
- 超长整数的基础运算 算法实现之乘、除篇
- 超长整数的基础运算 算法实现之模、模幂篇
- 超长整数的基础运算 算法实现自平方篇
- 超长整数的基础运算 算法实现之加、减篇
- 超长整数的基础运算 算法实现之准备篇
- 算法基础:整数拆分问题(Golang实现)
- 实用算法实现-第 24 篇 高精度整数运算
- 十六进制字符串转换成十进制整数的C++实现源代码
- 递归函数实现整数转换成其二进制
- 基于delphi的超长整数四则运算的实现
- 大整数四则运算算法与实现(C++)
- 超长整数的基础运算 问题提出篇
- 实用算法实现-第 24 篇 高精度整数运算
- 【字符串处理算法】字符串转换为整数的算法设计及C代码实现
- 算法--两种方法实现一个Add函数,让两个整数相加,但是不能使用+、-、*、/等四则运算符。
- 超长整数的基础运算 之小结
- 大数运算(超长整数运算)算法的简单分析
- 同余幂的原理和C++实现,附赠一个10进制数转换为任意进制的数组的算法。
- 对超长整数运算(大数运算)的算法探究
- 将十进制整数转换成b进制字符串 (递归和非递归实现)