zoukankan      html  css  js  c++  java
  • js用8421码实现10进制转2进制

    今天早上突然心血来潮决定用 '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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。谢谢合作。

    -->

  • 相关阅读:
    操作系统的运行机制
    操作系统的目标和功能
    操作系统的特征
    操作系统的基本概念
    error: a label can only be part of a statement and a declaration is not a statement
    克隆git仓库中的一个分支
    ubuntu下update-alternatives命令的使用
    堆排序
    合并排序
    递归算法的一些规则
  • 原文地址:https://www.cnblogs.com/mgso/p/6181095.html
Copyright © 2011-2022 走看看