10進数を16進数に変換します。負数・小数の値にも対応しています。 符号付き の値を変換するには第二引数のsignFlgにTrueを指定します。16進数を10進数に変換するにはhexToDec関数 (自作関数)を使います。
- 構文
- UString = decToHex( dec, signFlg, digits, errorMsg )
- 引数
- dec (Double,String)必須
- 10進数
- signFlg (Boolean = False)省略可
- 符号付きならばTrue
- digits (Boolean = False,Double = False)省略可
- 変換した16進数の桁数合わせを自動で行うかを示すブール値、もしくは桁数を表す数値(8,16,24,32,64のいずれか)を指定
- errorMsg (Boolean = False)省略可
- エラーメッセージを出力するかを示すブール値
- 戻り値
- 16進数に変換した値
プログラム
解説
- 2-8行目
- 変数の初期化を行います。
- hex
- 16進数に変換した値を代入
- msg
- エラーメッセージを代入。16進数に変換する過程でエラーが発生した場合、この変数にエラー内容が代入されます。
- isError
- dec2hex
- 10進数から変換するときに求めた各桁を16進数に変換するための配列。インデックスに指定された10進数の値から16進数の値を返します。例えばdec2Hex[3]を指定した場合は3、dec2Hex[10]を指定した場合はAが返ります。
- decimalFlg
- decが小数かを示すブール値をdecimalFlgに代入。decが小数であればTrue、小数でなければFalseが代入されます。
- negativeFlg
- decが負数かを示すブール値をnegativeFlgに代入。decが負数であればTrue、負数でなければFalseが代入されます。
- 10-11行目
- decの絶対値を返す。
- 13-15行目
- 10進数を整数部と小数部に分ける
- integer
- decの小数点以下を切り捨て、整数部分のみを代入
- decimal
- decを1で割ったあまり(小数点以下の部分のみ)を代入
- 17-15行目
- 23-15行目
- 37,0行目
digitsがFalseでなければNoMatch
- 38行目
16進数とは
16進数とは0〜9の10個の数字と、A〜Fの6個のアルファベット(小文字も可)の16種類の文字を使って数値を表現する方法です。
コンピュータの内部では電圧の高低を1と0(スイッチのON/OFF)に対応付けた2進数であらゆる情報を表しています。そのためコンピュータにとって2進数が便利なのですが、2進数は桁が大きくなりすぎるため人間にとっては扱いづらい表現です。16進数だと1桁が4bitとビット数自体が\(2^{n}\)という形式になり便利なため、コンピュータで数値を扱うときには16進数がよく使われます。例えば、Web開発でカラーコードは#(シャープ)の後に数字6桁で#FF5733、文字コードは0x41のような16進数で表現されます。
10進数では一つの桁において0~9の10種類の文字を扱うことができるのに対し、16進数では0、1、2、3、4、5、6、7、8、9、A、B、C、 D、E、Fの16種類の文字を扱うことができます。
1から9までは10進数と同じ数値ですが、AからFは10から15に対応しています。
| 10進数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 16進数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 |
10進数では0,1,2,…,7,8,9と1桁で表現できる上限まで来ると10と桁が増えるように、16進数も0,1,2,…,D,E,Fの次は10と桁が上がります。このとき10はジュウではなく、イチゼロと読みます。
また10進数と16進数など複数の基数表記がある場合、例えば10が10進数のジュウなのか16進数のイチゼロなのかの区別がつきません。そのため以下の表に示すような接頭辞・接尾辞のいずれかをつけることで区別します。基数とは位取り記数法で数値を書き記す際に各桁の重み付けの基本となる数のことで10進数では10、16進数では16です
| 進数 | 2進数 | 8進数 | 10進数 | 16進数 |
|---|---|---|---|---|
| 接頭辞 | 0b | 0oもしくは0 | 0d | 0x |
| 接尾辞 | b | o | d | h |
例えば0x10や10hというように書けば16進数の10、0d10や10dと書けば10進数の10というように何進数の表記なのかが明確になります。10進数のときは接頭辞・接尾辞を省略することもあります。
接頭辞・接尾辞のアルファベットはそれそれBinary(2進数)、Octal(8進数)、Decimal(10進数)、Hexadecimal(16進数)の頭文字から来ています。16進数の接頭辞のみheXadecimalと3文字目のxです。
ただし接尾辞のbやdは16進数の値との区別がつかなくなることがあるので、接頭辞を使うのをおすすめします。
右下に基数を小さく添え字として書く方法もありますが、この表記は数学で使われることがあってもプログラミングで使われることはあまりありません。
例えば\(1011_{2}\)は2進数の1011、\(13_{10}\)は10進数の13、\(5F_{16}\)は16進数の5Fのようになります。
10進数を16進数に変換
10進数を16進数に変換するとき整数部分と小数部分では計算方法が違うため、整数部分と小数部分に分けて計算を行います。
ここでは例として10進数の6975.64208984375を16進数に変換する処理で説明していきます。
このとき整数部分は6975、小数部分は0.64208984375となります。小数部分は計算に必要なので先頭に0.をつけておきます。
整数部分
整数部分を10進数から16進数に変換するには、10進数の整数部分を商が0になるまで16で割っていきます。この余りを10〜15はA〜Fに置き換えて、順に左に並べたものが16進数に変換した値となります。
| 10進数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 16進数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
10進数の6975は16進数に変換すると1B3Fとなります。

変換する値が整数の場合、変換処理はこれで終了です。
小数部分
小数部分を10進数から16進数に変換するには、10進数の小数部分が0になるまで16倍していきます。16倍したときの整数部分を10〜15はA〜Fに置き換えて、順に右に並べていきます。計算するたびに整数部分は0にし、小数部分がなくなるまで続けます。いくら小数部分を16倍しても0にならないものは無限小数といいます。
10進数の0.64208984375は16進数に変換すると0.A46となります。
10進数の6975.64208984375は整数部分の1B3F(6975)と小数部分の.A46(0.64208984375)を合わせ1B3F.A46となります。

負数
変換元の10進数が負数の場合、2の補数を求めることで負数を求めることができます。2の補数とはビットをすべて反転させて1を加える処理のことです。
まず1B3F.A46は2進数で0001 1011 0011 1111.1010 0100 0110となります。これのビットをすべて反転させて1110 0100 1100 0000.0101 1011 1001。1を加えて1110 0100 1100 0000.0101 1011 1010。これを16進数に戻すとE4C0.5BAとなりこれが負数になります。
無限小数
小数の10進数を16進数に変換する場合、小数部が0になるまで16を掛け続けます。しかし、繰り返し16を掛けても余りが0にならない場合があり、これを無限小数と呼びます。
例えば、10進数の0.3を16進数に変換すると、0.4CCC CCCC …という無限小数になります。この値を再び10進数に戻すと、切り捨てられて0.2999 9999 9813 7355 …という値になりもとの値と誤差が生じます。
符号付数値表現
decToHex関数 (自作関数)では、第二引数のsignFlgにTrueを指定することで先頭のビットを符号のビットとして扱うことができます。16進数では先頭にマイナスの記号を付けて負数を表すわけではないため先頭のビットで符号を表します。
例えば129を16進数で表すと81ですが、これを10進数に戻すとき先頭ビットを符号として扱うかどうかで値が変わってしまいます。16進数の81は2進数で表すと10000001と先頭が1になり、これは符号付きでは負数の値を表すことになります。16進数の81を10進数に変換するとき、先頭のビットを符号ビットとした場合は-127、符号ビットとしない場合は129となります。
そのためsignFlgにTrueを指定した場合、10進数の正数を16進数に変換したとき最上位の桁が8〜F(2進数で1xxx)になる場合、変換した値の先頭に00を付与することで、正数と負数を区別します。
- 結果
16進数の81は符号付きか符号なしかで10進数では-127か129になりますが、0081は符号付きかどうかに関係なく129になります。
使い方
10進数の整数を16進数に変換
10進数の10を16進数に変換します。
- 結果
10進数の255を16進数に変換します。
- 結果
10進数の整数を符号付きで16進数に変換
10進数の整数を符号付きで16進数に変換する場合は、signFlgとdigitsにTrueを指定する必要があります。
以下は10進数の255を符号付きで16進数に変換するプログラムです。
- 結果
10進数の255を符号なしで16進数に変換したときはFF(2進数で1111 1111)でしたが、符号付きの場合先頭ビットが1と負数の扱いとなってしまうので先頭に0を付与することで先頭ビットが正数として扱われます。
FFは8bitで先頭に0を付与すると12bitとなります。decToHex関数 (自作関数)は全体のビット数が8、16、24、32、64のいずれかになるようにしているので、16bitに桁合わせするため00を付与しています。
以下は符号付きと符号なしの16進数を18進数に変換したときの結果の違いです。
16進数のFFは先頭ビットが1なので先頭ビットを符号として見るかどうかで結果が変わってしまいます。
FFは符号付きで変換した場合、先頭ビットが1なので負数として扱われ-1、符号なしの場合は255となります。
- 結果
一方先頭ビットに0を付与した場合は先頭ビットと数値の一部としてみても符号として見ても正数として判断されるので、signFlgをTrueでもFalseでも同じ255として変換されます。
- 結果
10進数の-255を符号付きで16進数に変換します。
- 結果
変換するビット数(桁数)を指定
第三引数のdigitsに8、16、24、32、64、True、Falseを指定することで16進数に変換した値のビット数(桁数)を調整することができます。
16進数は4bitで1桁を表すので、8bitは2桁、16bitは4桁、24bitは6桁、32bitは8桁、64bitは16桁となります。
以下は12345.5を16進数に変換した値を出力するプログラムです。
- 結果
16進数に変換できなかったときはエラーが発生し、エラー内容を表示するには第三引数のerroFlgにTrueを指定します。8bitではビット数が足りないためエラーが発生し、16bitも同様にビット数が足りないため小数点以下が切り捨てられています。
- 結果
10進数の負数を指定ビットで16進数に変換
10進数の-32を8bit、16bit、24bit、32bit、64bitで16進数に変換します。
- 結果
指定ビットで表現できない場合はERR_VALUEが返ります。-123456789は16進数に変換するとF8A432EBで32bitになるため、8bit、16bbit、24bitを指定した変換ではエラーとなります。
- 結果
プログラム実行例
オブジェクトを作成したアプリケーションを示す数値を取得
ビットマップ画像を補色に変換(24ビット)
関連記事
- hexToDec関数 (自作関数)
- 16進数を10進数に変換します。負数・小数の値にも対応しています。
- binToHex関数 (自作関数)
- 2進数を16進数に変換します。負数・小数の値にも対応しています。
- hexToBin関数 (自作関数)
- 16進数を2進数に変換します。負数・小数の値にも対応しています。
- decToBin関数 (自作関数)
- 10進数を2進数に変換します。負数・小数の値にも対応しています。
- binToDec関数 (自作関数)
- 2進数を10進数に変換します。負数・小数の値にも対応しています。
- 16進数
- radToDeg関数 (自作関数)
- 弧度法から度数法に変換します。
- degToRad関数 (自作関数)
- 度数法から弧度法に変換します。
- ARABIC関数 (自作関数)
- ローマ数字をアラビア数字に変換します。
- ROMAN関数 (自作関数)
- アラビア数字をローマ数字に変換します。
