您的位置:首页 > 其它

十进制小数转二进制序列

2008-11-19 13:42 176 查看
这是一个我实验中首先要解决的问题,而且伴随着大量的重复运算。如果能够在每次操作中节省1ms,在N次运算后,就会体现巨大的时间差异!所以,我希望尽可能地写出高效率的代码。

二进制编码,我干脆采用bitset,节省空间,另外有基础算法可用。

转换的过程,大致可以分两种方式:

1,考虑到小数都是有精度限制的,比如精确到十进制小数点后5位;那么我可以将它转化为整数,然后再转化为bitset。采用整数编码方式,来记录小数。

2,按照《十进制小数转二进制小数方法》这篇文章中介绍的,采用乘以2的方式,得到每一位的数值,赋给bitset。同样是小数点后5位,那么最多需要17位二进制标示,我最多进行17次乘以2操作即可。通过if (i的整数部分==0)来进行设置。

这两种方法,谁的效率更高呢?按照我的想法,应该是第一种。因为第一种方法=一次乘法 + 一次bitset转换;第二种方法=17次乘法 + O(17)次赋值 + bitset初始化 + 17次if判断,显然后者更慢。

如果进行优化,效果又会如何呢?实验证明之!

#include <windows.h>

#include <time.h>

#include <bitset>

#include <iostream>

using namespace std;

const int MAX_COUNT=10000000;

void fun1()

{

double d=0.12345;

long i = d*100000;

bitset<100> bits(i);

}

void fun2()

{

double d=0.12345;

bitset<100> bits;

for (int i=0;i<17;i++)

{

d=d*2;

if (d>1.00000)

{

bits.set(100-i);//随便将某一位置1,在时间上没影响

}

}

}

void main()

{

SYSTEMTIME time1,time2;

GetSystemTime(&time1);

for (int i=0;i<MAX_COUNT;i++)

{

fun1();

}

GetSystemTime(&time2);

cout<<time1.wMinute<<' '<<time1.wSecond<<' '<<time1.wMilliseconds<<endl;

cout<<time2.wMinute<<' '<<time2.wSecond<<' '<<time2.wMilliseconds<<endl;

GetSystemTime(&time1);

for (i=0;i<MAX_COUNT;i++)

{

fun2();

}

GetSystemTime(&time2);

cout<<time1.wMinute<<' '<<time1.wSecond<<' '<<time1.wMilliseconds<<endl;

cout<<time2.wMinute<<' '<<time2.wSecond<<' '<<time2.wMilliseconds<<endl;

}

结论:采用第一种方式更加节省运算时间,编码方式更加直接。

0.12345,经第一种方式转化,bitset为:11000000111001

经第二种方式转化,bitset为:0.0001111110011010.....,显然两者连编码都是不一样的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: