decToHex関数

本ページには広告が含まれています。

10進数を16進数に変換します。負数・小数の値にも対応しています。 符号付き の値を変換するには第二引数のsignFlgTrueを指定します。16進数を10進数に変換するにはhexToDec関数 (自作関数)を使います。

構文
  1. 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進数に変換した値

プログラム

UWSC

解説

  1. 2-8行目
    UWSC
    変数の初期化を行います。
    hex
    16進数に変換した値を代入
    msg
    エラーメッセージを代入。16進数に変換する過程でエラーが発生した場合、この変数にエラー内容が代入されます。
    isError
    dec2hex
    10進数から変換するときに求めた各桁を16進数に変換するための配列。インデックスに指定された10進数の値から16進数の値を返します。例えばdec2Hex[3]を指定した場合は3dec2Hex[10]を指定した場合はAが返ります。
    decimalFlg
    decが小数かを示すブール値をdecimalFlgに代入。decが小数であればTrue、小数でなければFalseが代入されます。
    negativeFlg
    decが負数かを示すブール値をnegativeFlgに代入。decが負数であればTrue、負数でなければFalseが代入されます。
  2. 10-11行目
    UWSC
    decの絶対値を返す。
  3. 13-15行目
    UWSC
    10進数を整数部と小数部に分ける
    integer
    decの小数点以下を切り捨て、整数部分のみを代入
    decimal
    dec1で割ったあまり(小数点以下の部分のみ)を代入
  4. 17-15行目
    UWSC
  5. 23-15行目
    UWSC
  6. 37,0行目
    UWSC

    digitsFalseでなければNoMatch

  7. 38行目

16進数とは

16進数とは09の10個の数字と、AFの6個のアルファベット(小文字も可)の16種類の文字を使って数値を表現する方法です。

コンピュータの内部では電圧の高低を10(スイッチのON/OFF)に対応付けた2進数であらゆる情報を表しています。そのためコンピュータにとって2進数が便利なのですが、2進数は桁が大きくなりすぎるため人間にとっては扱いづらい表現です。16進数だと1桁が4bitとビット数自体が\(2^{n}\)という形式になり便利なため、コンピュータで数値を扱うときには16進数がよく使われます。例えば、Web開発でカラーコードは#(シャープ)の後に数字6桁で#FF5733、文字コードは0x41のような16進数で表現されます。

10進数では一つの桁において09の10種類の文字を扱うことができるのに対し、16進数では0123456789ABCDEFの16種類の文字を扱うことができます。

1から9までは10進数と同じ数値ですが、AからF10から15に対応しています。

10進数 012345678910111213141516
16進数 0123456789ABCDEF10

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

例えば0x1010hというように書けば16進数の100d1010dと書けば10進数の10というように何進数の表記なのかが明確になります。10進数のときは接頭辞・接尾辞を省略することもあります。

接頭辞・接尾辞のアルファベットはそれそれBinary(2進数)Octal(8進数)Decimal(10進数)Hexadecimal(16進数)の頭文字から来ています。16進数の接頭辞のみheXadecimalと3文字目のxです。

ただし接尾辞のbdは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で割っていきます。この余りを1015AFに置き換えて、順に左に並べたものが16進数に変換した値となります。

10進数0123456789101112131415
16進数0123456789ABCDEF

10進数の6975は16進数に変換すると1B3Fとなります。

10進数の6975を16進数に変換

変換する値が整数の場合、変換処理はこれで終了です。

小数部分

小数部分を10進数から16進数に変換するには、10進数の小数部分が0になるまで16倍していきます。16倍したときの整数部分を1015AFに置き換えて、順に右に並べていきます。計算するたびに整数部分は0にし、小数部分がなくなるまで続けます。いくら小数部分を16倍しても0にならないものは無限小数といいます。

10進数の0.64208984375は16進数に変換すると0.A46となります。

10進数の6975.64208984375は整数部分の1B3F(6975)と小数部分の.A46(0.64208984375)を合わせ1B3F.A46となります。

10進数の0.64208984375を16進数に変換

負数

変換元の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関数 (自作関数)では、第二引数のsignFlgTrueを指定することで先頭のビットを符号のビットとして扱うことができます。16進数では先頭にマイナスの記号を付けて負数を表すわけではないため先頭のビットで符号を表します。

例えば129を16進数で表すと81ですが、これを10進数に戻すとき先頭ビットを符号として扱うかどうかで値が変わってしまいます。16進数の81は2進数で表すと10000001と先頭が1になり、これは符号付きでは負数の値を表すことになります。16進数の81を10進数に変換するとき、先頭のビットを符号ビットとした場合は-127、符号ビットとしない場合は129となります。

そのためsignFlgTrueを指定した場合、10進数の正数を16進数に変換したとき最上位の桁が8F(2進数で1xxx)になる場合、変換した値の先頭に00を付与することで、正数と負数を区別します。

UWSC
結果
プレーンテキスト

16進数の81は符号付きか符号なしかで10進数では-127129になりますが、0081は符号付きかどうかに関係なく129になります。

使い方

10進数の整数を16進数に変換

10進数の10を16進数に変換します。

UWSC
結果
プレーンテキスト

10進数の255を16進数に変換します。

UWSC
結果
プレーンテキスト

10進数の整数を符号付きで16進数に変換

10進数の整数を符号付きで16進数に変換する場合は、signFlgdigitsTrueを指定する必要があります。

以下は10進数の255を符号付きで16進数に変換するプログラムです。

UWSC
結果
プレーンテキスト

10進数の255を符号なしで16進数に変換したときはFF(2進数で1111 1111)でしたが、符号付きの場合先頭ビットが1と負数の扱いとなってしまうので先頭に0を付与することで先頭ビットが正数として扱われます。

FFは8bitで先頭に0を付与すると12bitとなります。decToHex関数 (自作関数)は全体のビット数が816243264のいずれかになるようにしているので、16bitに桁合わせするため00を付与しています。

以下は符号付き符号なしの16進数を18進数に変換したときの結果の違いです。

16進数のFFは先頭ビットが1なので先頭ビットを符号として見るかどうかで結果が変わってしまいます。

FFは符号付きで変換した場合、先頭ビットが1なので負数として扱われ-1、符号なしの場合は255となります。

UWSC
結果
プレーンテキスト

一方先頭ビットに0を付与した場合は先頭ビットと数値の一部としてみても符号として見ても正数として判断されるので、signFlgTrueでもFalseでも同じ255として変換されます。

UWSC
結果
プレーンテキスト

10進数の-255を符号付きで16進数に変換します。

UWSC
結果
プレーンテキスト

変換するビット数(桁数)を指定

第三引数のdigits816243264TrueFalseを指定することで16進数に変換した値のビット数(桁数)を調整することができます。

16進数は4bitで1桁を表すので、8bitは2桁、16bitは4桁、24bitは6桁、32bitは8桁、64bitは16桁となります。

以下は12345.5を16進数に変換した値を出力するプログラムです。

UWSC
結果
CSV

16進数に変換できなかったときはエラーが発生し、エラー内容を表示するには第三引数のerroFlgTrueを指定します。8bitではビット数が足りないためエラーが発生し、16bitも同様にビット数が足りないため小数点以下が切り捨てられています。

UWSC
結果
CSV

10進数の負数を指定ビットで16進数に変換

10進数の-32を8bit、16bit、24bit、32bit、64bitで16進数に変換します。

UWSC
結果
プレーンテキスト

指定ビットで表現できない場合はERR_VALUEが返ります。-123456789は16進数に変換するとF8A432EBで32bitになるため、8bit、16bbit、24bitを指定した変換ではエラーとなります。

UWSC
結果
プレーンテキスト

プログラム実行例

オブジェクトを作成したアプリケーションを示す数値を取得

UWSC
結果
CSV
使用関数

ビットマップ画像を補色に変換(24ビット)

UWSC
使用関数

関連記事

hexToDec関数 (自作関数)
16進数を10進数に変換します。負数・小数の値にも対応しています。
binToHex関数 (自作関数)
2進数を16進数に変換します。負数・小数の値にも対応しています。
hexToBin関数 (自作関数)
16進数を2進数に変換します。負数・小数の値にも対応しています。
decToBin関数 (自作関数)
10進数を2進数に変換します。負数・小数の値にも対応しています。
binToDec関数 (自作関数)
2進数を10進数に変換します。負数・小数の値にも対応しています。
16進数
radToDeg関数 (自作関数)
弧度法から度数法に変換します。
degToRad関数 (自作関数)
度数法から弧度法に変換します。
ARABIC関数 (自作関数)
ローマ数字アラビア数字に変換します。
ROMAN関数 (自作関数)
アラビア数字ローマ数字に変換します。