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
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。謝謝合作。

-->


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM