每一只程序猿都知道:在现实生活中,我们主要是使用十进制数。但是在计算机科学中,二进制则非常重要。计算机内的所有的内容都是用0和1表示的。
那么我们不禁好奇,人类输入的十进制数据是怎样被计算机转换成它能理解的二进制数据的呢?
我们首先会用到stack这个数据结构。因此有必要声明一个stack类。
function Stack() { var items = []; this.push = function(element){ items.push(element); }; this.pop = function(){ return items.pop(); }; this.peek = function(){ return items[items.length-1]; }; this.isEmpty = function(){ return items.length == 0; }; this.size = function(){ return items.length; }; this.clear = function(){ items = []; }; this.print = function(){ console.log(items.toString()); }; this.toString = function(){ return items.toString(); }; }
以下是利用栈来实现数制之间的转换的示意图和实际的代码。
//233 == 11101001 //2x(10x10) + 3x(10) + 3x(1) function divideBy2(decNumber){ var remStack = new Stack(), rem, binaryString = ‘‘; while (decNumber > 0){ rem = Math.floor(decNumber % 2); remStack.push(rem); decNumber = Math.floor(decNumber / 2); } while (!remStack.isEmpty()){ binaryString += remStack.pop().toString(); } return binaryString; } console.log(divideBy2(233)); console.log(divideBy2(10)); console.log(divideBy2(1000)); /* The folow algorithm converts from base 10 to any base */ function baseConverter(decNumber, base){ var remStack = new Stack(), rem, baseString = ‘‘, digits = ‘0123456789ABCDEF‘; while (decNumber > 0){ rem = Math.floor(decNumber % base); remStack.push(rem); decNumber = Math.floor(decNumber / base); } while (!remStack.isEmpty()){ baseString += digits[remStack.pop()]; } return baseString; } console.log(baseConverter(100345, 2)); console.log(baseConverter(100345, 8)); console.log(baseConverter(100345, 16));
程序运行结果如下:
注意:The Math.floor() function returns the largest integer less than or equal to a given number.Because floor() is a static method of Math, you always use it as Math.floor(), rather than as a method of a Math object you created (Math is not a constructor).
原文:http://my.oschina.net/donngchao/blog/526180