[Javascript] 数値データの進数変換

javascriptでバイナリ操作を行う時に2進数や16進数を扱ったり、相互に変換する必要があるので、javascriptで操作できるようにしてみた。
まずはググる
検索結果
2進数・16進数・10進数-JavaScript入門
parseInt() – JavaScript | MDN – Mozilla Developer Network
ビット演算子 – JavaScript | MDN
JavaScriptプログラミング講座【数値について(Number)】
JavaScript で n 進数を扱う: Days on the Moon
親切書いていただいているサイトが沢山ヒットしました。
10進数を他の進数に変換
どうやら「parseInt」と「toString」を組み合わせる事で進数変換ができる事がわかった。
ルールは下記の通りだ
1. parseIntで元進数を定義
2. toStringで変換後進数を指定
1 2 3 4 5 6 7 8 9 10 11 |
var num = 12345; //2進数 var decimal2 = parseInt(num,10).toString(2); //8進数 var decimal8 = parseInt(num,10).toString(8); //16進数 var decimal16= parseInt(num,10).toString(8); //結果 console.log(decimal2 , decimal8 , decimal16); > 11000000111001 30071 30071 |
簡単なのだが、何故かparseIntを使わないと10進数でNGが出るのが何故か今のところ理解出来ていないが、とりあえずお作法として覚えておこう。
1 2 3 4 5 |
console.log("12345".toString(2)); > "12345" console.log(12345.toString(2)); > Uncaught SyntaxError: Invalid or unexpected token |
parseIntを使うことで進数を確定するというような意味なのかもしれないね。
2進数,8進数,16進数→10進数
1 2 3 |
var dec2 = parseInt("1101" , 2); console.log(dec2); >13 |
1 2 3 |
var dec8 = parseInt("11" , 8); console.log(dec8); >9 |
1 2 3 |
var dec16 = parseInt("aa" , 16); console.log(dec16); >170 |
10進数に変換するのは、parseIntの役割だったんですね。
なれていないとtoStringを使っちゃいそうでなんだかヤヤこいよ。
ヤヤこくしないために関数作ってみる
面倒くさがり屋の下駄としては、こういう場合は関数を使って以後ネイティブ関数とはおさらばするという手段を取りたい。
概要
decimal.convertという関数を作り、元値、元進数、変換後進数を指定することで値を返せばいい。
ただし、指定が間違っている場合はエラーを返すようにしなければならない。
エラー対象としては、元進数と元値が間違っている場合だ。
例えば、3という数字を2進数と指定するとエラーという事。
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
(function(){ var $$={}; /** * Decimal - convert * @param : num / 元数値 / ex) "0101" * @param : dec1 / 元数値の進数 / ex) 2 * @param : dec2 / 変換後の進数 * @return : dec2 - num */ $$.decimal = function( num , dec1 , dec2 ){ var num = num.toString(); var dec1 = Number(dec1); var dec2 = Number(dec2); var ret = parseInt(num , dec1).toString(dec2); //16進数の時に英字を大文字にする if(dec2 === 16){ret = ret.toUpperCase();} return ret; }; __LIB = $$; })(); |
実行サンプル
1. 10進数の”111”を16進数に変換する。
※16進数の英字は大文字に変換しています。
2. 2進数の”0111″を10進数に変換
1 2 3 4 5 6 7 |
<script type="text/javascript"> console.log(__LIB.decimal("0111",10,16)); console.log(__LIB.decimal("0101",2,16)); </script> > 6F > 5 |