现实生活中,我们主要使用十进制。但在计算科学中,二进制非常重要,因为计算机里的所
有内容都是用二进制数字表示的(0和1)。没有十进制和二进制相互转化的能力,与计算机交流
就很困难。
要把十进制转化成二进制,我们可以将该十进制数除以2(二进制是满二进一)并对商取整,
直到结果是0为止。举个例子,把十进制的数 10转化成二进制的数字,过程大概是如下这样。
大学的计算机课一般都会先教这个进制转换。下面是对应的算法描述。
function decimalToBinary(decNumber)( const remStack = new Stack(); // 这里可以理解自己封装一个栈的 push,pop等 let number = decNumber; let rem; let binaryString while (number > 0) { // {1} rem = Math. floor (number % 2): // (2} remStack.push (rem); // {3} number = Math. floor (number / 2): // {4} } while (!remStack.isEmpty()) { // {15} binaryString += remStack.pop() .toString(); } return binaryString; }
在这段代码里,当除法的结果不为 口时(行(1子),我们会获得一个余数,并放到栈里(行
{2}、行{3})。然后让结果继续除以2(行{4了)。另外请注意:JavaScript 有数值类型,但是它
不会区分整数和浮点数。因此,要使用 Math.f1oor 两数仅返回除法运算结果的整数部分。最
后,用pop 方法把栈中的元素都移除,把出栈的元素连接成宇符串(行151)。
用刚才写的算法做一此测试,使用以下代码把结果输出到控制台里。
console. log (decimalToBinary (233) ); // 11101001
console. log (decimalToBinary (10) ) ;
// 1010
console. log (decimalToBinary (1000) ); // 1111101000
迸制转换算法
我们可以修改之前的算法,使之能把十进制转换成基数为 2~36的任意进制。除了把十进制
数除以2转成二进制数,还可以传人其他任意进制的基数为参数,就像下面的算法这样。
function baseConverter (decNumber, base) { const remStack = new Stack () ; const digits = '0123456789ABCDEFGHIJKLMNOPORSTUVWXYZ' ; // {6} let number = decNumber; let rem; let baseString if (! (base >= 2 && base <= 36)) { return ''; } while (number > 0){ rem = Math. floor (number % base); remStack.push(rem); number = Math. floor (number / base); while (!remStack. isEmpty () ){ baseString += digits[remStack.pop()]: // (7} return baseString; }
我们只需要改变一个地方。在将十进制转成二进制时,余数是0或1;在将十进制转成八进
制时,余数是0~7;但是将十进制转成十六进制时,余数是0~9加上A、B、C、D、E和F(对
应10、11、12、13、14和15)。因此,我们需要对栈中的数字做个转化才可以(行{63和行(7了)。
因此,从十一进制开始,字丹表中的每个字丹将表示相应的基数。字母 A代表基数 11,B代表
基数 12,以此类推。
可以使用之前的算法,输出结果如下。
console. log (baseConverter(100345,2)); // 11000011111111001
console. log (baseConverter(100345,8)); // 303771
console. log (baseConverter(100345,16));// 187F9
console. log (baseConverter (100345, 35)); // 2BWO