今天早上突然心血來潮決定用 '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
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。謝謝合作。
-->