8進数
日本語 | 八進数 |
英語 | octal digit、octal number |
ふりがな | はっしんすう、はちしんすう |
フリガナ | ハッシンスウ、ハチシンスウ |
数値において、桁の繰り上げ条件が「8」である数値法。
一般に使われている繰り上がりの方法は「10進数」である。この「10進数」では「10」が次の桁へと増える条件である。
たとえば「29」という値に「1」を加えると、右端の桁は「10」となり、繰り上がりの条件を満たす。右端の桁は「0」に変わり、ひとつ上の桁である「2」に1が加えられ「3」となり、結果「30」となる。
対して8進数では、次の桁へと増える条件が「8」となる。
たとえば「27」という値に「1」を加えると、右端の桁は「8」となり、繰り上がりの条件を満たす。右端の桁は「0」に変わり、ひとつ上の桁である「2」に1が加えられ「3」となり、結果「30」となる。
このように、繰り上がりの条件が「8」であるのが、「8進数」の考え方である。
整数リテラルで8進数を記述する場合は、整数リテラルの先頭に「0」を付ける。
たとえば「int i = 013;」という場合、8進数の整数リテラル「13」を変数iに代入する。
この時、各桁の数値は0~7までしか記述できない。8や9は「繰り上がりの数を超えている」からである。
また、先頭に付ける「0」は普通のゼロなので、読み間違えたり誤って付記してしまうことがあるため十分注意すること。
整数値を8進数表記の文字列に変換する場合には、IntegerクラスのtoOctalString()メソッドを使用する。
注意しなければならないのは、別に0を付けてint型変数に格納しても、10 進数表記でint型変数に格納しても、内部的には2 進数で格納されているのであり、どちらも関係ないという点である。
内部的には2 進数で格納されているものを、文字列に変換する際に10進数表記に変換するか8進数表記に変換するか、という違いである。
8進数の1桁は、2進数の3桁に該当する。2の3乗が8となるためである。
しかし、「3桁」というのは中途半端な数であるため、8進数はあまり使用されない。
代わりに、4桁に該当する「16進数」を使用することが多い。
一般に使われている繰り上がりの方法は「10進数」である。この「10進数」では「10」が次の桁へと増える条件である。
たとえば「29」という値に「1」を加えると、右端の桁は「10」となり、繰り上がりの条件を満たす。右端の桁は「0」に変わり、ひとつ上の桁である「2」に1が加えられ「3」となり、結果「30」となる。
対して8進数では、次の桁へと増える条件が「8」となる。
たとえば「27」という値に「1」を加えると、右端の桁は「8」となり、繰り上がりの条件を満たす。右端の桁は「0」に変わり、ひとつ上の桁である「2」に1が加えられ「3」となり、結果「30」となる。
このように、繰り上がりの条件が「8」であるのが、「8進数」の考え方である。
整数リテラルで8進数を記述する場合は、整数リテラルの先頭に「0」を付ける。
たとえば「int i = 013;」という場合、8進数の整数リテラル「13」を変数iに代入する。
この時、各桁の数値は0~7までしか記述できない。8や9は「繰り上がりの数を超えている」からである。
また、先頭に付ける「0」は普通のゼロなので、読み間違えたり誤って付記してしまうことがあるため十分注意すること。
整数値を8進数表記の文字列に変換する場合には、IntegerクラスのtoOctalString()メソッドを使用する。
注意しなければならないのは、別に0を付けてint型変数に格納しても、10 進数表記でint型変数に格納しても、内部的には2 進数で格納されているのであり、どちらも関係ないという点である。
内部的には2 進数で格納されているものを、文字列に変換する際に10進数表記に変換するか8進数表記に変換するか、という違いである。
8進数の1桁は、2進数の3桁に該当する。2の3乗が8となるためである。
しかし、「3桁」というのは中途半端な数であるため、8進数はあまり使用されない。
代わりに、4桁に該当する「16進数」を使用することが多い。
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// 0~16までを8進数で表示します。
for( int iF1 = 0; iF1 <= 16; ++iF1 )
{
// 8進数で出力するときにはIntegerクラスの
// toOctalString()メソッドを使用します。
System.out.print( iF1 );
System.out.print( "\t\t" );
System.out.print( Integer.toOctalString( iF1 ) );
System.out.print( "\t\t" );
System.out.print( getIntBit( iF1 ) );
System.out.println();
}
// 10進数 8進数 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 10 00000000000000000000000000001000
// 9 11 00000000000000000000000000001001
// 10 12 00000000000000000000000000001010
// 11 13 00000000000000000000000000001011
// 12 14 00000000000000000000000000001100
// 13 15 00000000000000000000000000001101
// 14 16 00000000000000000000000000001110
// 15 17 00000000000000000000000000001111
// 16 20 00000000000000000000000000010000
// このように、8進数の1桁は、2進数の3桁に当たります。
// 「3桁」というのは中途半端なので、ほとんどの場合
// 16進数の方が使われます。
// 8進数を整数リテラルで記述する場合は、先頭に
// 「0」を付けます。
// たとえば8進数の「13」は「013」と記述します。
int i = 013;
System.out.println( i );
System.out.println( Integer.toOctalString( i ) );
System.out.println( getIntBit( i ) );
// 11
// 13
// 00000000000000000000000000001011
// 前述の出力結果と一致していることを確認して
// ください。
// 8進数なので、必ずすべての桁は「0~7」の値と
// なります。それ以外だとコンパイルエラーになります。
// ※コンパイルエラーの例
// int i2 = 018;
// ※エラーメッセージ
// 型 int のリテラル 018 は範囲外です
// ※コンパイルエラーの例ここまで
}
/**
* 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までを8進数で表示します。
for( int iF1 = 0; iF1 <= 16; ++iF1 )
{
// 8進数で出力するときにはIntegerクラスの
// toOctalString()メソッドを使用します。
System.out.print( iF1 );
System.out.print( "\t\t" );
System.out.print( Integer.toOctalString( iF1 ) );
System.out.print( "\t\t" );
System.out.print( getIntBit( iF1 ) );
System.out.println();
}
// 10進数 8進数 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 10 00000000000000000000000000001000
// 9 11 00000000000000000000000000001001
// 10 12 00000000000000000000000000001010
// 11 13 00000000000000000000000000001011
// 12 14 00000000000000000000000000001100
// 13 15 00000000000000000000000000001101
// 14 16 00000000000000000000000000001110
// 15 17 00000000000000000000000000001111
// 16 20 00000000000000000000000000010000
// このように、8進数の1桁は、2進数の3桁に当たります。
// 「3桁」というのは中途半端なので、ほとんどの場合
// 16進数の方が使われます。
// 8進数を整数リテラルで記述する場合は、先頭に
// 「0」を付けます。
// たとえば8進数の「13」は「013」と記述します。
int i = 013;
System.out.println( i );
System.out.println( Integer.toOctalString( i ) );
System.out.println( getIntBit( i ) );
// 11
// 13
// 00000000000000000000000000001011
// 前述の出力結果と一致していることを確認して
// ください。
// 8進数なので、必ずすべての桁は「0~7」の値と
// なります。それ以外だとコンパイルエラーになります。
// ※コンパイルエラーの例
// int i2 = 018;
// ※エラーメッセージ
// 型 int のリテラル 018 は範囲外です
// ※コンパイルエラーの例ここまで
}
/**
* 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までを8進数で表示します。 for( int iF1 = 0; iF1 <= 16; ++iF1 ) { // 8進数で出力するときにはIntegerクラスの // toOctalString()メソッドを使用します。 System.out.print( iF1 ); System.out.print( "\t\t" ); System.out.print( Integer.toOctalString( iF1 ) ); System.out.print( "\t\t" ); System.out.print( getIntBit( iF1 ) ); System.out.println(); } // 10進数 8進数 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 10 00000000000000000000000000001000 // 9 11 00000000000000000000000000001001 // 10 12 00000000000000000000000000001010 // 11 13 00000000000000000000000000001011 // 12 14 00000000000000000000000000001100 // 13 15 00000000000000000000000000001101 // 14 16 00000000000000000000000000001110 // 15 17 00000000000000000000000000001111 // 16 20 00000000000000000000000000010000 // このように、8進数の1桁は、2進数の3桁に当たります。 // 「3桁」というのは中途半端なので、ほとんどの場合 // 16進数の方が使われます。 // 8進数を整数リテラルで記述する場合は、先頭に // 「0」を付けます。 // たとえば8進数の「13」は「013」と記述します。 int i = 013; System.out.println( i ); System.out.println( Integer.toOctalString( i ) ); System.out.println( getIntBit( i ) ); // 11 // 13 // 00000000000000000000000000001011 // 前述の出力結果と一致していることを確認して // ください。 // 8進数なので、必ずすべての桁は「0~7」の値と // なります。それ以外だとコンパイルエラーになります。 // ※コンパイルエラーの例 // int i2 = 018; // ※エラーメッセージ // 型 int のリテラル 018 は範囲外です // ※コンパイルエラーの例ここまで } /** * 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(); } }