はじめMath! Javaでコンピュータ数学

第6回 同じ値でも中身はいろいろ[前編]

この記事を読むのに必要な時間:およそ 4 分

我々人間にとっては10進数が最もわかりやすい形式です。しかし現在のデジタルコンピュータで取り扱う情報は,内部では全て2進数に変換されて,記憶・処理されています。コンピュータが唯一処理できるのは2進数だけです。ただし2進数で表記した場合,10進数に比べて桁数が多くなり,人間にとっては一目で理解しにくいため,たいていは16進数に読み替えて表示させます。

プログラマは,これらの3つの異なる表現方法を読み取ったり変換したりする技術が必要になります。コンピュータで厳密に数値を取り扱う際には,避けて通れません。

そこで,これから数学的な表現やアルゴリズムを記述する方法を用いて,2進数・10進数・16進数を相互に換算する方法を再確認します※1)。

図6.1 見た目はいっしょ。中身は?

図6.1 見た目はいっしょ。中身は?

記数法と基数

2進数・10進数・16進数などといった数値の表現方法を記数法といいます。記数法とは,適当な文字と記号を用い,特定の規則で数値を表現することです。2・10・16といった数を,それぞれの記数法の基数(きすう)といいます。基数とは,桁上がりするときの数の大きさのことです。

これら基数の異なる記数法間の換算を簡単にできる電卓もありますが,桁数が小さな数値であればちょいっと筆算や暗算できるといいですね。

※1
Java言語で取り扱うことができる数値型には整数型と実数型があります。実数型についてはIEEE754という規格で仕組みが取り決められています。IEEE754については,今回学習する数の表現方法を基礎に,次回学習する予定です。

2進数・10進数・16進数の相互変換

2進・10進変換

2進数とは,数を0と1だけで表現する方法です。例えば10進数の0,1,2は,2進数では(0)B,(1)Bと数え,次で桁上がりし,(10)B となります。2進数の数値に( )Bを付けて記述するのは,他の記数法と明確に区別するための工夫です。同様の意味で10進数の数値には( )D,16進数の数値には( )Hを用います。

正の整数の変換方法

2進数と10進数の間の正の整数の変換方法を次に示します。2進数から10進数への変換については数学記号を用いて1つの式の形にきれいにまとまります。10進数を2進数に変換する方法は文章にしています。途中でいくつかの判断と,処理の分岐が必要なためです。まるでプログラムのようですね。

2進数から10進数への変換方法

ただし,akは2進数数値の右からk桁目の数字(0または1) のこと。

10進数から2進数への変換方法
  • (1) 整数変数nを定義し,n=1と初期化する。
  • (2) 整数変数dを定義し,基数変換しようとする10進数の数値をその値とする(「dに数値を代入する」という)。
  • (3) 2進数の各桁の数値を格納するために,整数変数mを定義する。m は2進数の桁数に応じてその都度m1,m2と追加する。
  • (4) dを2で割る。余りが求める2進数の数値のn桁目である。余りをmnに代入,商をdに代入する。
  • (5) dが0ならば(8)へ。dが0でないなら次へ進む。
  • (6) nをひとつ増やしたものをnの新しい値とする。
  • (7) (4)へもどる。
  • (8) 求める2進数の数値は(mnmn-1mn-2…m1)B。処理終了。

10進数から2進数への変換方法は,ちょっと言葉が難しかったでしょう。しかし,実際に手を動かしてみると難しくはないんです。図6.2にその手順を示します。この例にならって,(1101)Bを10進数に,(25)Dを2進数に変換してみてください※2)。

図6.2 2進←→10進変換

図6.2 2進←→10進変換

※2
(1101)Bは(13)D,(25)Dは(11001)B です。
小数を含む数の変換方法

次に少数を含む場合の数の変換方法を示します。基本的に整数の変換方法と同じなのですが,少しだけ違いがあります。具体的な変換の様子を図6.3に示しました。整数部分には整数の変換方法を,小数部分には小数の変換方法を適用しているのを確認してください。この例にならって,(0.0111)Bを10進数に,(0.5625)Dを2進数に変換してみてください※3)。

2進数小数部分を10進数小数へ変換する方法

ただし,akは2進数の小数点以下k桁目の数字(0または1)のこと。

10進数小数部分を2進数小数へ変換する方法
  • (1) 整数変数nを定義し,n=1と初期化する。
  • (2) 実数変数dを定義し,10進数の小数部の数値を代入する。
  • (3) 2進数の各桁の数値を格納するために,整数変数mを定義する。mは2進数の桁数に応じてその都度m1m2と追加するものとする。
  • (4) dに2を乗ずる。計算結果の整数部分が求める2進数小数の小数点以下n桁目である。整数部分の値(0か1)をmnに代入する。積の小数点以下の値のみをdの新しい値とする。
  • (5) dが0ならば(8)へ。dが0でないなら次へ進む。
  • (6) nをひとつ増やしたものをnの新しい値とする。
  • (7) (4)へもどる。
  • (8) 求める2進数の数値は(0.m1…mn-3mn-2mn)B。変換作業終了

10進数の小数部分を2倍した結果が0にならないと,永遠にこのアルゴリズムは終わりません。このため,コンピュータである小数を2進数に変換する場合は,表現可能な桁数を超えた時点で変換を打ち切ります。ここで生じる誤差,打ち切り誤差については,この連載中もうしばらくしてから浮動小数点数のところで詳しく述べることにします。

図6.3 2進小数←→10進小数変換

図6.3 2進小数←→10進小数変換

※3
(0.0111)B は(0.4375)D,(0.5625)D は(0.1001)B です。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。

コメント

コメントの記入