JavaScript おれおれ Advent Calendar 2011 – 5日目

1、2、3、ダー!!(←繰り上がりました)

世の中には基数というものがありまして、数値は9の次が10になる10進数だけでなく、7の次が10になる8進数、9の次がAで、BCDEFときてようやくその次に10になる16進数、かと思えば1の次がいきなり10になる2進数と、様々に表現されます。

それを相互に変換する仕組みを考えます。

流れ

まず数値(number型の値)はあくまで「数値」であり、その表現方法たる基数とは無縁です。(何進数で言い表しても、目の前のりんごの数は変わらないでしょ?)

だので、当然の事ですが、任意の基数で表現する場合は文字列(string型の値)とします。基数を変換する場合は一度基数を捨てて数値としてから、それを目的の基数で表現しなおす、というようにします。

まとめると、こういう流れです。

  1. n進法で表現された数値の文字列を数値にする。
  2. 数値を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