这是一个我实验中首先要解决的问题,而且伴随着大量的重复运算。如果能够在每次操作中节省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.....,显然两者连编码都是不一样的。