JavaScript おれおれ Advent Calendar 2011 – 5日目
1、2、3、ダー!!(←繰り上がりました)
世の中には基数というものがありまして、数値は9
の次が10
になる10進数だけでなく、7
の次が10
になる8進数、9
の次がA
で、B
、C
、D
、E
、F
ときてようやくその次に10
になる16進数、かと思えば1
の次がいきなり10
になる2進数と、様々に表現されます。
それを相互に変換する仕組みを考えます。
流れ
まず数値(number型の値)はあくまで「数値」であり、その表現方法たる基数とは無縁です。(何進数で言い表しても、目の前のりんごの数は変わらないでしょ?)
だので、当然の事ですが、任意の基数で表現する場合は文字列(string型の値)とします。基数を変換する場合は一度基数を捨てて数値としてから、それを目的の基数で表現しなおす、というようにします。
まとめると、こういう流れです。
- n進法で表現された数値の文字列を数値にする。
- 数値をm進法で表現した文字列にする。
n進法で表現された数値の文字列→数値
組み込み関数のparseInt()
を使います。
この関数は第2引数で基数を指定する事ができます。(昨日も触れましたね!)
var source = "100"; // 元の値 var radix = 8; // 基数 var num = parseInt(source, radix); // 数値化 console.log(num); // => 64
数値→n進法で表現した文字列
こちらは関数ではなくメソッド、 .toString()
を使います。
.toString()
自体は全てのオブジェクトに備わっていますが、数値の .toString()
はちょっと特殊で、引数に基数を与える事ができます。省略時は10
になります。
var num = 64; // 数値 var radix = 16; // 基数 var result = num.toString(radix); // 基数を指定して文字列化 console.log(result); // => "40"
関数にまとめてみる
/** * @param {String} source 元の値 * @param {Number} sourceRadix 元の値の基数 * @param {Number} resultRadix 目的の基数 * @returns {String} sourceをresultRadixで表現した値 */ function exchangeRadix(source, sourceRadix, resultRadix) { // 数値化 var num = parseInt(source, sourceRadix); // 基数を指定して文字列化 var result = num.toString(resultRadix); return result; }
console.log(exchangeRadix("100", 8, 16)); // => "40"
ちなみにボンバイエは「奴を殺せ!」って意味らしいです。
ボンバIE!