Rubyでプログラミング入門 RSSフィード

2006-10-30

[]リテラルその2

前回に引き続き、リテラルについてです。

今日は数値リテラルを学びます。

数値リテラル

まずは公式サイトのリファレンスを確認しましょう。

数値リテラル


なんかもう、さすがにこれを見たら十分でしょう、という気がしないでもないですが、せっかくなので表にしてみます。

今回は数値リテラルのうち、整数と浮動小数点数のみを取り上げます。

整数 10進表現 123
-123
0d123
16進表現 0xffff
2進表現 0b1011
8進表現 0377
0o377
浮動小数点数 1.23
1.2e-3

やはり一番自然なのは、整数ならば「123」という書き方ですし、小数ならば「1.23」みたいな形式ですね。

ですので、たぶん特別な理由が無い限りは最も自然に思える書き方をしておけば良いのだと思います。

一応、すべての書き方を試すコードを作って実行してみます。

puts('■10進整数\n')
puts(123)
puts(-123)
puts(0d123)

puts('■16進整数')
puts(0xffff)

puts('■2進整数')
puts(0b1011)

puts('■8進整数')
puts(0377)
puts(0o377)

puts('■浮動小数点数')
puts(1.23)
puts(1.2e-3)

↓実行結果

■10進整数\n
123
-123
123
■16進整数
65535
■2進整数
11
■8進整数
255
255
■浮動小数点数
1.23
0.0012

あれ、実行結果は全部10進数表記なんですね……

取り敢えずその辺は良いでしょう。とにかくこのような表記方法で、ソースコードの中で数値を表現することができます。

文字列リテラルのように特別な記号で修飾するなどの処理は基本的に必要ありませんので、特に難しくはないと思います。

以上です。


……と、軽く流したいところですが、そうもいきません。

このコードでは、見覚えの無い関数らしきものを利用しています。適当に流さずに、ちゃんとリファレンスを確認してみます。

puts

説明と実行結果を見比べて頂けると思うのですが、今回のコードでは出力時に"\n"を記述していません。

にも関わらず一回の出力毎に改行されているのがputsの働きだったりします。

また、putsのサンプルコードには次のように書かれています。

puts "foo", "bar\n", "baz"

いままでのものと違って、関数名の隣に小括弧がありません。

実はRubyでは、『関数(メソッド)に対する引数が明らかであるとき、小括弧を省略して記述することができる』、という特徴があります。

ですので、上のコードも次のように記述可能です。

puts '■10進整数\n'
puts 123
puts -123
puts 0d123

puts '■16進整数'
puts 0xffff

puts '■2進整数'
puts 0b1011

puts '■8進整数'
puts 0377
puts 0o377

puts '■浮動小数点数'
puts 1.23
puts 1.2e-3

すっきりしました。

人の目からみてもこれは明らかだろ、という場合には積極的に省略してしまってよさそうです。


10進数以外で表示したい!

まぁ、どうしてもそういう要求が出てくることもあると思います。

少なくとも、整数値に関してはその要求を簡単に満たす方法が用意されているようです。

詳しい内容は次回にまわすとして、実際のコードだけ示しておきます。

puts '■10進整数\n'
puts 123.to_s(16)  # 16進表記
puts -123.to_s(8)  #  8進表記
puts 0d123.to_s(2) #  2進表記

puts '■16進整数'
puts 0xffff.to_s(16)

puts '■2進整数'
puts 0b1011.to_s(2)

puts '■8進整数'
puts 0377.to_s(8)
puts 0o377.to_s(8)

↓実行結果

■10進整数\n
7b
-173
1111011
■16進整数
ffff
■2進整数
1011
■8進整数
377
377

ポイントの部分はこんな形式になっています。

<数値リテラル>.to_s(<基数>)

この基数の値を変更すれば、3進数だろうが12進数だろうが変換することが可能です。

[]基数変換とか

基数

さて、何やらさらりと“基数”という言葉が出てきています。

一般的な用語といえばそうなのですが、聞いたこともないという方も居そうなので補足します。

まずは用語辞典をひいてみましょう。

基数 【radix

数値を表現する際に、各桁の重み付けの基本となる数。我々が普段している10進数では、10倍ごとに桁が上がっていくので、基数は10である。2進数、8進数、10進数、16進数の基数はそれぞれ2、8、10、16である。

読めばなんとなくわかりますね。別段難しいことではないようです。

それでは、この基数を相互に変換することを考えてみます。


位取り記数法

基数を変換する――というだけでは少々曖昧な気もするので、その前に知っておきたいことがあります。

それが、“位取り記数法”という名称です。

位取り記数法

位取り記数法(くらいどりきすうほう)は、数の表現方法の一種で、適当な自然数 N >1を指定して N 種類の記号(数字)を用意し、それを列べることによって数を表すための規則である。

位取り記数法で指定された自然数 N をこの記数法の基数といい、基数が N であるような位取り記数法を「N 進法」「N 進記数法」という。N 進法では、N 種類の数字からなる記号列において、隣り合う上位の桁に下位の桁の N 倍の意味を持たせる位取りによって数を表現する。

とまぁ小難しくかいてありますが、実はなんのことはなくて、普段普通の人がアラビア数字を使って数値を表記している場合、この“位取り記数法”という表現方法を用いています。

要するに普通の書き方、です。そんな説明でいいのかわかりませんが。

そして、先ほど調べた“基数”についても改めて解説されています。

このあたりを踏まえると、普段我々が使っている数の表記法は『基数を10とした位取り記数法』である、ということなのだと思います。

そして、この位取り記数法のなかで基数を別の数にすること――これが、“基数変換”になります。


10進数ってなんなのか

位取り記数法を意識したうえで、慣れ親しんだ10進数について見直してみます。

たとえば、次のような数値があります。

1234

なんの変哲もありません。「この数値はなに?」と尋ねられれば、「せんにひゃくさんじゅうよん」と問題なく答えて頂けるでしょう。

実はこの「せんにひゃくさんじゅうよん」という読み方がちょっとしたポイントだったりします。

このように数字同士をくっつけて表記し、さらに「数値」は何か、と聞かれた場合に「いちにぃさんよん」と答える方は……たまにしか居ません(と思います)。


しかし、確かに数字をひとつひとつ分解すれば、単に「1と2と3と4」が順番に並んでいるに過ぎません。

にも関わらず、自然に頭の中では「これはせんにひゃくさんじゅうよんだろ……」と解釈されているはずです。

このとき、「1と2と3と4」は額面どおりの値ではありません。

「1→実は千」であり、「2→実は二百」「3→実は三十」「4→実はも何も四」という風に各数字に対して、「ある計算」が施されてしまっています。

このとき、どのようなルールに則って計算されているのかというと、

ある桁の数字の値 × {10の(桁 − 1)乗}

という計算です。

たとえば先ほどの「1234」における「2」とは、

2 × {10^(3 − 1)}
→ 2 × 100
→ 200

という計算から、実は「二百」という数値であることがわかります。

当たり前といえば当たり前すぎる話ですが、このときに掛けられる『10の(桁 − 1)乗』のことを、各桁の“重み”といいます。

これは、位取り記数法の裏に隠されている暗黙の値です。

では、なぜこの値は『10の(桁 − 1)乗』になるのでしょうか。

それはいうまでもなく10進数は10個の集まりで一桁繰り上がるから、です。

ということは、もしも

1234

が実は10進数ではなく16進数だったとしたら、各桁の値には『16の(桁 − 1)乗』が掛かることになるわけです。

というわけで実際に計算してみると、

1234(16) → 1 × {16~(4 - 1)} + 2 × {16^(3 - 1)} + 3 × {16^(2 - 1)} + 4 × {16^(1 - 1)}
         → 1 × 4096 + 2 × 256 + 3 × 16 + 4 × 1
         → 4096 + 512 + 48 + 4
         → 4660

という具合です。

そして実はこれこそが、N進数から10進数への基数変換のやり方になります。

N進数の各桁には『Nの(桁 − 1)乗』の重みがかかりますので、そこだけうまく置き換えて同じように計算するだけで10進数への変換は楽々できてしまいます。

慣れれば簡単なので、経験のない方は2進・8進・16進あたりから10進に変換する練習をしておくといつか役に立つかもしれません。少なくとも、基本情報処理などの資格取得には役立つと思いますw

検算には、Googleの電卓機能(http://www.google.com/help/calculator.html)を使ったり、[ファイル名を指定して実行]で「calc」として、関数電卓を利用すると良いですね。


10進数以外への変換は、また別の機会に書きます。


因みに、こういう話題に興味を持ったぜ、という方には『Write Great Code』という書籍が個人的にはおすすめです。

まつもとさん繋がり、というあたりも重要です。

[]感謝とおことわり

いつもこのブログをご覧下さっている皆様、本当にありがとうございます。

こんなつまらない、且つ遅々として話題の進まないブログに関心を持ってくださる稀有な方もいらっしゃるようで、光栄の極みです。

ただでさえ進行が遅いので、なるべく毎日書き進めたいと考えているのですが、実はこの先数日なかなか時間がとれない可能性があります。


何かというと自身の結婚式が次の大安に迫っているからなのですがw

そんなまったくの私事により少々更新が滞るかと思いますが、ちゃんと続ける気はありますので、どうか見捨てないであげてくださいw

以上、誠に勝手なお願いでした。