十进制小数转二进制序列

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

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

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

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

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

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

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

 

  1. #include <windows.h>
  2. #include <time.h>
  3. #include <bitset>
  4. #include <iostream>
  5. using namespace std;
  6. const int MAX_COUNT=10000000;
  7. void fun1()
  8. {
  9.     
  10.     double d=0.12345;
  11.     long i = d*100000;
  12.     bitset<100> bits(i);
  13. }
  14. void fun2()
  15. {
  16.     double d=0.12345;
  17.     bitset<100> bits;
  18.     for (int i=0;i<17;i++)
  19.     {
  20.         d=d*2;
  21.         if (d>1.00000)
  22.         {
  23.             bits.set(100-i);//随便将某一位置1,在时间上没影响
  24.         }
  25.     }
  26.     
  27. }
  28. void main()
  29. {
  30.     SYSTEMTIME time1,time2;
  31.     GetSystemTime(&time1);
  32.     for (int i=0;i<MAX_COUNT;i++)
  33.     {
  34.         fun1();
  35.     }
  36.     GetSystemTime(&time2);
  37.     cout<<time1.wMinute<<' '<<time1.wSecond<<' '<<time1.wMilliseconds<<endl;
  38.     cout<<time2.wMinute<<' '<<time2.wSecond<<' '<<time2.wMilliseconds<<endl;
  39.     GetSystemTime(&time1);
  40.     for (i=0;i<MAX_COUNT;i++)
  41.     {
  42.         fun2();
  43.     }
  44.     GetSystemTime(&time2);
  45.     cout<<time1.wMinute<<' '<<time1.wSecond<<' '<<time1.wMilliseconds<<endl;
  46.     cout<<time2.wMinute<<' '<<time2.wSecond<<' '<<time2.wMilliseconds<<endl;
  47. }

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

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

经第二种方式转化,bitset为:0.0001111110011010.....,显然两者连编码都是不一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值