这几天在复习计算机原理,看到二进制忽然想到二进制转10进制的公式,然后转念一想10进制转二进制的公式好像没印象,那索性自己写出来。
结果学渣的我发现,并不能写出来!什么数列,对数,xx函数忘得一干二净,而且需要有需要判断的地方,于是崩溃了,以前代数题并没写过条件啊~
索性用C#代码搞出来(虽然在C#里有方法直接转换)
二进制值 | 10进制值 | 公式 |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
10 | 2 | f(2)=10^1 =10 |
11 | 3 | f(3):比 log₂3最小的整数位1,记录10^1,并3-(2^1)=1,f(1)=1,则最终结果为10^1+f(1)=10+1=11 |
100 | 4 | f(4): log₂4=2,整数,直接返回10^2 |
101 | 5 | f(5):比 log₂5最小的整数位2,记录10^2,并5-(2^2)=1,f(1)=1,则最终结果为10^2+f(1)=100+1=101 |
110 | 6 | f(6):比 log₂6最小的整数位2,记录10^2,并6-(2^2)=2,f(2)=10,则最终结果为10^2+f(2)=100+10=110 |
111 | 7 | ……………… |
1000 | 8 | ……………… |
1001 | 9 | ……………… |
1010 | 10 | ……………… |
1011 | 11 | ……………… |
1100 | 12 | ……………… |
1101 | 13 | ……………… |
1110 | 14 | ……………… |
1111 | 15 | f(15):比 log₂15最小的整数位3,记录10^3,并15-(2^3)=7,f(7)=111,则最终结果为10^3+f(7)=1000+111=1111 |
10000 | 16 | f(16):比 log₂6最小的整数位4,整数,直接返回10^4 |
公式是这样子的。 假如求10进制数n的二进制,先求以2为底的n的对数log₂N,判断log₂N是否为为整数,如果为整数直接返回10^log₂N,否则求出比log₂N最小的整数t(如1.001取1,2.02取2,3.9取3)。求出并记录10^t,然后将n减去2^t并重复执行以上步骤,返回的值与记录的10^t相加。
以上我们设这个函数为f(n);
贴代码,无疑,用了递归~
private double DecimalToBinarySystem(int decimalNumber) { double standard = 0; if (decimalNumber==0) { return 00; } if (decimalNumber==1) { return 01; } var doubleValue = (double) decimalNumber; var logarithm = Math.Log(doubleValue,2 ); var logFormat = Math.Truncate(logarithm); var baseNum = Math.Pow(10, logFormat); if (logarithm.Equals(logFormat)) { return baseNum; } var leftNumber = doubleValue - Math.Pow(2, logFormat); return baseNum + DecimalToBinarySystem((int)leftNumber); }
仅测试过大于等于0的整数,负数和小数未测试。
只是乐于思考一下,抛砖引玉欢迎指正