16進数
日本語 | 十六進数 |
英語 | hex digit、hex number |
ふりがな | じゅうろくしんすう |
フリガナ | ジュウロクシンスウ |
「16」が次の桁へと増える条件の、数値法。
一般的に使用されている「10進数」では、「10」が次の桁へと増える条件である。39に1を加えると、一番右端の桁は「10」となり、この時この桁は「0」に変わり、代わりに次の桁である「3」に1が加えられ「4」となり、結果40となる。
対して、16進数ではこの次の桁へと増える条件が「16」となる。10進数での「10~15」は「A~F」で記述し、「F」の桁が1増えると「0」になり、ひとつ上の桁が1増える。たとえば「1F」の値に1を加えると「20」となる。
16進数の1桁は、2進数の4桁に該当する。2の4乗が16となるためである。
そのため、16進数は2進数の4桁をまとめて1桁で表記するために使用される。
2進数4桁を16進数1桁に読み替える時には、右端の桁を0桁目とするとき、「0桁目が1なら1」「1桁目が1なら2」「2桁目が1なら4」「3桁目が1なら8」として足し合わせればよい。
16進数表記は2進数表記の「読み替え」であるため、16進数から2進数に頭の中で読み替えられる技術を持つと便利である。たかだか16通りなので、16通りすべて憶えてしまうといいだろう。
int型の整数値を2進数で表記した場合、int型のサイズは32ビットのため、当然32文字が必要となる。たとえば「1000000」を2進数で表記すると「00000000000011110100001001000000」となり、とても長い。
だが、これを16進数で表記した場合、その4分の1の8文字で済む。たとえば「1000000」を16進数で表記すると「000F4240」と、とても短い。
メモリ上のビットの状態を見る場合(たとえば文字化けの原因を調べるため文字列のダンプを取得する場合)には、2進数で出力すると長くなり読みにくくなるため、代わりに16進数で表記することがほとんどである。
また1バイトは8ビット、つまり16進数2つに当たるため、バイト単位での表記もしやすい。
整数リテラルで16進数表記を使用する場合には、頭に0xもしくは0Xを付けて表記する。
整数値を16進数表記の文字列に変換する場合には、IntegerクラスのtoHexString()メソッドを使用する。
いずれにせよ注意しなければならないのは、別に0xを付けてint型変数に格納しても、10進数表記でint型変数に格納しても、内部的には2進数で格納されているのであり、どちらも関係ないという点である。
内部的には2進数で格納されているものを、文字列に変換する際に10進数表記に変換するか16進数表記に変換するか、という違いである。
16進数表記の正しい記法は特に決まっておらず、場面毎に異なる。
多くの場合、頭に0xを付ける。これを付けないと「0x51」が「51」になるなど、16進数であることが分からないためである。
「A~F」は、大文字小文字どちらも使用され、特に違いはない。
一般的に使用されている「10進数」では、「10」が次の桁へと増える条件である。39に1を加えると、一番右端の桁は「10」となり、この時この桁は「0」に変わり、代わりに次の桁である「3」に1が加えられ「4」となり、結果40となる。
対して、16進数ではこの次の桁へと増える条件が「16」となる。10進数での「10~15」は「A~F」で記述し、「F」の桁が1増えると「0」になり、ひとつ上の桁が1増える。たとえば「1F」の値に1を加えると「20」となる。
16進数の1桁は、2進数の4桁に該当する。2の4乗が16となるためである。
そのため、16進数は2進数の4桁をまとめて1桁で表記するために使用される。
2進数4桁を16進数1桁に読み替える時には、右端の桁を0桁目とするとき、「0桁目が1なら1」「1桁目が1なら2」「2桁目が1なら4」「3桁目が1なら8」として足し合わせればよい。
16進数表記は2進数表記の「読み替え」であるため、16進数から2進数に頭の中で読み替えられる技術を持つと便利である。たかだか16通りなので、16通りすべて憶えてしまうといいだろう。
int型の整数値を2進数で表記した場合、int型のサイズは32ビットのため、当然32文字が必要となる。たとえば「1000000」を2進数で表記すると「00000000000011110100001001000000」となり、とても長い。
だが、これを16進数で表記した場合、その4分の1の8文字で済む。たとえば「1000000」を16進数で表記すると「000F4240」と、とても短い。
メモリ上のビットの状態を見る場合(たとえば文字化けの原因を調べるため文字列のダンプを取得する場合)には、2進数で出力すると長くなり読みにくくなるため、代わりに16進数で表記することがほとんどである。
また1バイトは8ビット、つまり16進数2つに当たるため、バイト単位での表記もしやすい。
整数リテラルで16進数表記を使用する場合には、頭に0xもしくは0Xを付けて表記する。
整数値を16進数表記の文字列に変換する場合には、IntegerクラスのtoHexString()メソッドを使用する。
いずれにせよ注意しなければならないのは、別に0xを付けてint型変数に格納しても、10進数表記でint型変数に格納しても、内部的には2進数で格納されているのであり、どちらも関係ないという点である。
内部的には2進数で格納されているものを、文字列に変換する際に10進数表記に変換するか16進数表記に変換するか、という違いである。
16進数表記の正しい記法は特に決まっておらず、場面毎に異なる。
多くの場合、頭に0xを付ける。これを付けないと「0x51」が「51」になるなど、16進数であることが分からないためである。
「A~F」は、大文字小文字どちらも使用され、特に違いはない。
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// 0~16までを10進数、16進数、2進数で表示します。
for( int iF1 = 0; iF1 <= 16; ++iF1 )
{
// 整数値を16進数で出力するときには、Integerクラスの
// toHexString()メソッドを使用します。
System.out.print( iF1 );
System.out.print( ",\t" );
System.out.print( Integer.toHexString( iF1 ) );
System.out.print( ",\t" );
System.out.print( getIntBit( iF1 ) );
System.out.println();
}
// 10進数, 16進数, 2進数
// 0, 0, 00000000000000000000000000000000
// 1, 1, 00000000000000000000000000000001
// 2, 2, 00000000000000000000000000000010
// 3, 3, 00000000000000000000000000000011
// 4, 4, 00000000000000000000000000000100
// 5, 5, 00000000000000000000000000000101
// 6, 6, 00000000000000000000000000000110
// 7, 7, 00000000000000000000000000000111
// 8, 8, 00000000000000000000000000001000
// 9, 9, 00000000000000000000000000001001
// 10, a, 00000000000000000000000000001010
// 11, b, 00000000000000000000000000001011
// 12, c, 00000000000000000000000000001100
// 13, d, 00000000000000000000000000001101
// 14, e, 00000000000000000000000000001110
// 15, f, 00000000000000000000000000001111
// 16, 10, 00000000000000000000000000010000
// このように、16進数の1桁は、2進数の4桁に当たります。
// そのため、2進数の表示の代わりに使います。
// できれば、16進数表記を見て2進数表記に脳内変換が
// できるようにしておきましょう。
// 整数リテラルを16進数で表記するときには、頭に0xを付けます。
// 中に格納したら16進数も10進数も関係なくなるので注意。
// というか実際には上記のような2進数で格納されています。
int i = 0xA;
System.out.println( Integer.toHexString( i ) );
System.out.println( i );
// a
// 10
// A~Fは小文字のa~fでも使えます。
i = 0xc;
System.out.println( Integer.toHexString( i ) );
System.out.println( i );
// c
// 12
// 0xの代わりに0XでもOK。
i = 0Xd;
System.out.println( Integer.toHexString( i ) );
System.out.println( i );
// d
// 13
// A~F以外の文字を使用することはできません。
// ※コンパイルエラーの例
// i = 0xG;
// ※エラーメッセージ
// 16 進数の数値リテラルが無効です
// ※コンパイルエラーの例ここまで
}
/**
* int型変数の整数値をビット形式で返します。
*/
private static String getIntBit( int i )
{
// int型変数をビット形式で文字列化します。
String source = Integer.toBinaryString( i );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 32; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
return strbuf.toString();
}
}
public class Sample
{
public static void main( String[] args )
{
// 0~16までを10進数、16進数、2進数で表示します。
for( int iF1 = 0; iF1 <= 16; ++iF1 )
{
// 整数値を16進数で出力するときには、Integerクラスの
// toHexString()メソッドを使用します。
System.out.print( iF1 );
System.out.print( ",\t" );
System.out.print( Integer.toHexString( iF1 ) );
System.out.print( ",\t" );
System.out.print( getIntBit( iF1 ) );
System.out.println();
}
// 10進数, 16進数, 2進数
// 0, 0, 00000000000000000000000000000000
// 1, 1, 00000000000000000000000000000001
// 2, 2, 00000000000000000000000000000010
// 3, 3, 00000000000000000000000000000011
// 4, 4, 00000000000000000000000000000100
// 5, 5, 00000000000000000000000000000101
// 6, 6, 00000000000000000000000000000110
// 7, 7, 00000000000000000000000000000111
// 8, 8, 00000000000000000000000000001000
// 9, 9, 00000000000000000000000000001001
// 10, a, 00000000000000000000000000001010
// 11, b, 00000000000000000000000000001011
// 12, c, 00000000000000000000000000001100
// 13, d, 00000000000000000000000000001101
// 14, e, 00000000000000000000000000001110
// 15, f, 00000000000000000000000000001111
// 16, 10, 00000000000000000000000000010000
// このように、16進数の1桁は、2進数の4桁に当たります。
// そのため、2進数の表示の代わりに使います。
// できれば、16進数表記を見て2進数表記に脳内変換が
// できるようにしておきましょう。
// 整数リテラルを16進数で表記するときには、頭に0xを付けます。
// 中に格納したら16進数も10進数も関係なくなるので注意。
// というか実際には上記のような2進数で格納されています。
int i = 0xA;
System.out.println( Integer.toHexString( i ) );
System.out.println( i );
// a
// 10
// A~Fは小文字のa~fでも使えます。
i = 0xc;
System.out.println( Integer.toHexString( i ) );
System.out.println( i );
// c
// 12
// 0xの代わりに0XでもOK。
i = 0Xd;
System.out.println( Integer.toHexString( i ) );
System.out.println( i );
// d
// 13
// A~F以外の文字を使用することはできません。
// ※コンパイルエラーの例
// i = 0xG;
// ※エラーメッセージ
// 16 進数の数値リテラルが無効です
// ※コンパイルエラーの例ここまで
}
/**
* int型変数の整数値をビット形式で返します。
*/
private static String getIntBit( int i )
{
// int型変数をビット形式で文字列化します。
String source = Integer.toBinaryString( i );
// 左0埋めします。
StringBuffer strbuf = new StringBuffer();
for( int iF1 = source.length(); iF1 < 32; ++iF1 )
{
strbuf.append( "0" );
}
strbuf.append( source );
return strbuf.toString();
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // 0~16までを10進数、16進数、2進数で表示します。 for( int iF1 = 0; iF1 <= 16; ++iF1 ) { // 整数値を16進数で出力するときには、Integerクラスの // toHexString()メソッドを使用します。 System.out.print( iF1 ); System.out.print( ",\t" ); System.out.print( Integer.toHexString( iF1 ) ); System.out.print( ",\t" ); System.out.print( getIntBit( iF1 ) ); System.out.println(); } // 10進数, 16進数, 2進数 // 0, 0, 00000000000000000000000000000000 // 1, 1, 00000000000000000000000000000001 // 2, 2, 00000000000000000000000000000010 // 3, 3, 00000000000000000000000000000011 // 4, 4, 00000000000000000000000000000100 // 5, 5, 00000000000000000000000000000101 // 6, 6, 00000000000000000000000000000110 // 7, 7, 00000000000000000000000000000111 // 8, 8, 00000000000000000000000000001000 // 9, 9, 00000000000000000000000000001001 // 10, a, 00000000000000000000000000001010 // 11, b, 00000000000000000000000000001011 // 12, c, 00000000000000000000000000001100 // 13, d, 00000000000000000000000000001101 // 14, e, 00000000000000000000000000001110 // 15, f, 00000000000000000000000000001111 // 16, 10, 00000000000000000000000000010000 // このように、16進数の1桁は、2進数の4桁に当たります。 // そのため、2進数の表示の代わりに使います。 // できれば、16進数表記を見て2進数表記に脳内変換が // できるようにしておきましょう。 // 整数リテラルを16進数で表記するときには、頭に0xを付けます。 // 中に格納したら16進数も10進数も関係なくなるので注意。 // というか実際には上記のような2進数で格納されています。 int i = 0xA; System.out.println( Integer.toHexString( i ) ); System.out.println( i ); // a // 10 // A~Fは小文字のa~fでも使えます。 i = 0xc; System.out.println( Integer.toHexString( i ) ); System.out.println( i ); // c // 12 // 0xの代わりに0XでもOK。 i = 0Xd; System.out.println( Integer.toHexString( i ) ); System.out.println( i ); // d // 13 // A~F以外の文字を使用することはできません。 // ※コンパイルエラーの例 // i = 0xG; // ※エラーメッセージ // 16 進数の数値リテラルが無効です // ※コンパイルエラーの例ここまで } /** * int型変数の整数値をビット形式で返します。 */ private static String getIntBit( int i ) { // int型変数をビット形式で文字列化します。 String source = Integer.toBinaryString( i ); // 左0埋めします。 StringBuffer strbuf = new StringBuffer(); for( int iF1 = source.length(); iF1 < 32; ++iF1 ) { strbuf.append( "0" ); } strbuf.append( source ); return strbuf.toString(); } }