Binary?转二进制不需要实现。

来源:互联网 发布:杰视帮淘宝美工教程 编辑:程序博客网 时间:2024/05/07 09:10

记得开始学C++的时候,一段时间沉迷上了有关二进制的算法,其中第一个就是写一个十进制转二进制的程序。

方法很简单,下面就是一个简单的长除法实现转换二进制:

#include <iostream>#include <string>#include <algorithm>using std::string;using std::cout;string DecimalToBinary(int Input){string OUT;for(;Input != 0;Input  /= 2)OUT += Input%2 ? '1':'0';reverse(OUT.begin(),OUT.end());return OUT;} int main(int argc, char ** argv){cout << DecimalToBinary(16);return 0;}


似乎很简洁,但这里对于输出一串二进制而进行了一系列字符串的处理似乎太过浪费了。

到这里,我们必须要回忆起一件事了:计算机不本来就是以二进制储存数据的吗?

所以我们要设计一个新的方案去实现二进制的输出(若需要使用二进制的数据,或许上面的方法是必要的)

也即是用计算机的方法进行操作:位运算。

例如:    Decimal:                5                16                23                46

Binary:                                 101         1 0000         1 0111        10 1110

那么简单的写成位运算就是

——1.NUM>>1//取到NUM的(n-1)比特位

       2.while(...)//重复步骤一直到取到NUM的1比特位->这一步利用递归实现,后入先出,直接避免反转的过程

       3.NUM&0x01//->真正的取二进制位->遵循步骤2的目的,后入先出

所以以上书写成规范的C/C++代码即为:

void GetBinary(int Input){if(Input)GetBinary(Input>>1);Input&0x01;return;}//我承认这很奇怪,但这的确是规范的代码,然而我们并未对这原生的二进制作任何操作//但比如我们输出它,我们就简单的cout就可以了。void GetBinary(int Input){if(Input)GetBinary(Input>>1);std::cout << Input&0x01;return;}

这样的话,代码本身应当是非常好理解,比如我们要取5的二进制,它就会如下操作


0.GetBinary(0000 0000 0000 0101)//sign:1
1.GetBinary(0000 0000 0000 0010)//sign:2
2.GetBinary(0000 0000 0000 0001)//sign:3
3.GetBinary(0000 0000 0000 0000)//sign:4
4.goto 4 && cout << 0 
5.goto 3 && cout << 1 
6.goto 2 && cout << 0
7.goto 1 && cout << 1
8.return

如果可以除去多余的一个0的函数调用的话,这样的递归应该是非常高效的。

这里偷个难,用Dev-C++的数据来看

此处递归输出2^62次方的数耗时0.0575s

而使用bitset类则耗时0.0631s

(个人觉得数据很不靠谱,而且执行越多次越快。。。##就当闹着玩吧)

最后呢,虽然这里只是做了十进制的实例,但对于位的运算一般是通用的,例如八进制,十六进制等,都能得到同样的效果(这不废话)

有时候,我们还是要注重本质才能更好地压榨计算机的性能。