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
(个人觉得数据很不靠谱,而且执行越多次越快。。。##就当闹着玩吧)
最后呢,虽然这里只是做了十进制的实例,但对于位的运算一般是通用的,例如八进制,十六进制等,都能得到同样的效果(这不废话)
有时候,我们还是要注重本质才能更好地压榨计算机的性能。
- Binary?转二进制不需要实现。
- 二进制加法的实现(字符串形式) Add Binary
- ZOJ3418--Binary Number//二进制
- Add Binary 二进制相加
- erlang binary 二进制错误
- Add Binary 二进制加法
- Binary-safe 二进制安全
- hdu5573 Binary Tree 二进制
- 二进制日志 Binary Log
- Add Binary:二进制加法
- Stack实现十进制转二进制
- 递归实现十进制转二进制
- 栈实现二进制转十进制
- 递归实现十进制转二进制
- 字符转二进制_C++实现
- 二进制转十进制(栈实现)
- 堆栈实现二进制转十进制
- java实现二进制转十六进制
- js正则表达式,去除首尾多余的空格或者换行
- C++ string类insert函数
- Python学习进阶资料
- 虚拟机Ubuntu装机配置
- 初学PHP(二)
- Binary?转二进制不需要实现。
- 运放电路:运算放大器的同相放大和反相放大
- mysql子查询用limit报错( “This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’ ”)
- matlab中getmapping函数
- Java菜鸟成长之路__Day_4_Java_如何写一个标准类?
- git教程
- 冒泡排序算法的原理与实现
- Codeforces Gym 100825 G. Tray Bien (DP)
- Ambari Hadoop集群HA整合Hue安装介绍