今天早上突然心血来潮决定用 '8421'和js来撸一个进制转换.(纯属心血来潮,有兴趣的可以看看.)
我们知道,通过8421码.可以快速的得到一个10进制的2进制.如下图:
如上图所示:我们将10进制的 '10'转换成2进制,
10=8+2; 那么8421码下面的8和2用1表示,4和1用0表示;则可以得到1010;这个1010便是10的二进制数.是不是很简答呢?
再来一个栗子:
.
到这里你可能会疑问,那如果是大于15呢(8+4+2+1完全不够用啊)?
很简单啊,8421不够那就168421 再不够就 ......1024,512,256,128,64,32.....1 ;
OK,到此为止我们知道如果通过8421码得到一个数的2进制.那么 代码走起
======================================================================
1,若数字对应8421则用1表示,否则用0;
1 function toBinary (num) { 2 //存储结果的数组 3 var arr = []; 4 var _8421 = [8,4,2,1]; 5 var fn = function(num){ 6 for(var i=0;i<_8421.length;i++) { 7 var temp = num-_8421[i]; 8 if(temp == 0){ 9 arr.push(1); 10 }else{ 11 arr.push(0); 12 } 13 } 14 return arr; 15 }; 16 17 //返回fn得到返回的数组,并去除前面的0 18 return fn(num).join('').replace(/^0+/,''); 19 } 20 21 console.log(toBinary(1)); //1 22 console.log(toBinary(2)); //10 23 console.log(toBinary(3)); // '' 24 console.log(toBinary(5)); // ''
2.上面的代码我们判断改数与8421中值的差值,如果等于0则用1表示,否则用0.但是问题来了:如果该数字不在8421中返回值就为空.想一想,除了等于0,还有大于0和小于0没有做判断.
考虑到这三种情况我们需要做:
1: 如果差值为0,那么直接返回改数组.剩余的位用0补齐,
2: 如果差值小于0,在用0表示改位的同时需要判断是否全部为0,如果是则返回该数组
3: 如果差值大于0:那么在用1表示改位的同时,需要把差值再次循环判断(递归),且8421数组应从当前位截断
代码如下:
1 function toBinary (num) { 2 //存储结果的数组 3 var arr = []; 4 var _8421 = [8,4,2,1]; 5 //二进制位数 6 var bit = _8421.length; 7 //判断数组值是否全为0 8 var isAll0 = function(arr){ 9 var flag = true; 10 for(var i=0;i<bit;i++){ 11 if(arr[i] != 0){ 12 flag = false; 13 continue; 14 } 15 } 16 return flag; 17 }; 18 var fn = function(num){ 19 for(var i=0;i<_8421.length;i++){ 20 //存放8421的临时值 21 var temp = _8421[i]; 22 //如果传入的数字与8421数组中相减为0 23 if(num-temp == 0){ 24 //该位用1表示 25 arr.push(1); 26 var length = arr.length; 27 //如果当前输入length小于bit位则用0补齐 28 if(length<bit){ 29 for(var c = 0;c<bit-length;c++){ 30 arr.push(0); 31 } 32 } 33 return arr; 34 }else{ 35 //如果小于0 则用0表示 36 if(num-temp<0){ 37 arr.push(0); 38 //当数组长度==二进制位数的时候判断是否全部为0 39 if(arr.length==bit){ 40 if(isAll0(arr)){ 41 //返回该数组 42 return arr; 43 } 44 } 45 //如果大于0 则用1表示 46 }else if(num-temp>0){ 47 arr.push(1); 48 //并且把8421数组从当前位索引截断 49 _8421.splice(0,i+1); 50 //把改数与当前位的差递归 51 return fn(num-temp); 52 } 53 54 } 55 } 56 }; 57 58 return fn(num).join('').replace(/^0+/,'') 59 } 60 61 console.log(toBinary(1)); //1 62 console.log(toBinary(2)); //10 63 console.log(toBinary(3)); //11 64 console.log(toBinary(5)); //101
3:通过判断三种情况.我们正确的得到了二进制数,但是还有问题;如果输入的值很大,而我们的数组只有8421.被固定死了.也就是说现在只能得到8+4+2+1 15以内的二进制值.如果大于这个值则无法计算.
一开始想的是,扩大这个数组.例如扩大到2048.但是问题又来了.大于2048+....+.的和又出问题了.于是我们需要一个函数动态创建8421码的数组:
1 var create8421 = function(num){ 2 var tempArr = [1]; 3 while(tempArr[0]-num<0){ 4 //如果两数相减为负数 5 //在数组第一位插入第二位的2倍值 6 tempArr.unshift(tempArr[0]*2); 7 } 8 return tempArr; 9 10 }; 11
这个函数接收一个num.并初始化一个tempArr=[1]作为8421的基准,然判断数组第一位和num的差值.如果小于0则向该数组第一位插入第二位2倍的数;这样即可得到一个由num控制大小的8421数组
最终代码如下:
1 function toBinary (num) { 2 var arr = []; 3 //根据输入的数创建对应大小的8421数组 4 var create8421 = function(){ 5 var tempArr = [1]; 6 while(tempArr[0]-num<0){ 7 //如果两数相减为负数 8 //在数组第一位插入第二位的2倍值 9 tempArr.unshift(tempArr[0]*2); 10 } 11 return tempArr; 12 13 }; 14 var _8421 = create8421(); 15 var bit = _8421.length; 16 //判断数组值是否全为0 17 var isAll0 = function(arr){ 18 var flag = true; 19 for(var i=0;i<bit;i++){ 20 if(arr[i] != 0){ 21 flag = false; 22 continue; 23 } 24 } 25 return flag; 26 }; 27 var fn = function(num){ 28 for(var i=0;i<_8421.length;i++){ 29 //存放8421的临时值 30 var temp = _8421[i]; 31 //如果传入的数字与8421数组中相减为0 32 if(num-temp == 0){ 33 //改位用1表示 34 arr.push(1); 35 var length = arr.length; 36 //如果当前输入length小于bit位则用0补齐 37 if(length<bit){ 38 for(var c = 0;c<bit-length;c++){ 39 arr.push(0); 40 } 41 } 42 return arr; 43 }else{ 44 //如果小于0 则用0表示 45 if(num-temp<0){ 46 arr.push(0); 47 if(arr.length==bit){ 48 //如果8位全是0则返回改数组 49 if(isAll0(arr)){ 50 return arr; 51 } 52 } 53 //如果大于0 则用1表示 54 }else if(num-temp>0){ 55 arr.push(1); 56 //并且把8421数组从当前位索引截断 57 _8421.splice(0,i+1); 58 //把改数与当前位的差递归 59 return fn(num-temp); 60 } 61 62 } 63 } 64 }; 65 66 return fn(num).join('').replace(/^0+/,'') 67 68 } 69 70 console.log(toBinary(77)); //1001101 71 console.log(toBinary(156)); //10011100 72 console.log(toBinary(5369)); //1010011111001 73 console.log(toBinary(66666)); //10000010001101010 74 console.log(toBinary(233333)); //111000111101110101
这样一个用'8421'码转换 进制的代码便完成了.
其实有个小问题:如果输入0的话直接给返回" ".原因是因为正则替换掉了0.来个正则大神讲解下:如果只有1一个0则保留0,否则替换由'0'开始的所有0;
代码写得有点粗糙.没有考虑太多.新手发文,求大神轻喷 = =#!
欢迎吐槽代码,指出错误.
<!--
作者:mgso
出处:http://www.cnblogs.com/mgso/p/6181095.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。谢谢合作。
-->