n進数から 10進数へ(Ruby)
Ruby で 10進数を n進数に直すのは int.to_s
で出来ます。しかし、その逆(n進数から 10進数へ)ができるかわからなかったので、メソッドを作ってみました。ただし、n は 2 から 10 までです。アルファベットを使って、36進数まで出来ないことはないですが、とりあえず。なお、不具合があると nil を返します。
#n進数のi(String)を10進数に変換する。ただしnは2から10。 def dec(i, n) return nil if n < 2 or n > 10 x = 0 for j in 0..(i.length - 1) return nil unless (a = i[-(j + 1)]).between?("0", "9") return nil if (b = a.to_i) >= n x += (n ** j) * b end x rescue nil end p dec("203", 5) #=>53
ありゃ、String#to_i(n)
で標準実装されていました。それも、n は 36進数までちゃんとサポートされています。抜かりがないなあ。
"203".to_i(5) #=>53
これで、n進数の計算もできますね。例えば 2進数で 1011 + 100101 は、次のように計算できます。
("1011".to_i(2) + "100101".to_i(2)).to_s(2) #=>"110000"
見た目があまりきれいではないですが。
※追記(2017/12/1)
2進数で 1011 + 100101 はこうですね。2進数リテラルがあるわけです。無知でした。
sprintf("%0b", 0b1011 + 0b100101) #=>"110000"
ただし、もちろん n進数リテラルがあるわけではないので、5進数とかなら元記事のようにやればいいです。