
「こんにちは、アミーゴ!」
「こんにちは、ビラーボ!」
「さまざまな番号付けシステムについて少しお話したいと思います。」
「人々が 10 進法を使用していることはすでに聞いたでしょう。このシステムの主な事実は次のとおりです。
1) 数字を書くには 10 桁が使用されます: 0、1、2、3、4、5、6、7、8、9。
2) 543 という数字は、500 + 4 10 + 3 1 を意味します。
「これは 5*100 + 4*10 + 3*1 と書くのと同じで、 5*10 2 + 4*10 1 + 3*10 0と書くことができます。
千、百、十、一は数字の 10 の累乗であることに注意してください。
1) 1 は 10 の 0 乗です。
2) 10 は 10 の 1 乗です。
3) 100 は 10 の 2 乗です。
4) 1000 は 10 の 3 乗などです。
「はい、分かりました。」
「しかし、ここで、数字が 8 つしかないと想像してください。そうすると、8 進法ができます。その主な事実は次のとおりです。」
1) 数字を書くには 8 桁が使用されます: 0、1、2、3、4、5、6、7。
2) 数字 543 8 は、5*8 2 +4*8 1 +3*8 0を意味します。つまり、5*64 + 4*8 + 3*1 = 320+32+3 = 320+32+3=355 10となります。
数字を表すのに何桁が使用されるかを示すために、添え字として 8 と 10 を書きました。
「理解できたと思います。数値を 8 進数から 10 進数に変換することはできたと思います。しかし、おそらくその逆はできなかったでしょう。」
「それほど難しいことではありません。砂の山を移動するには、数台のトラックを使用する必要があると想像してください。ダンプ トラック、普通のトラック、非常に小型のトラックがあります。しかし、トラックは満員でなければ進むことができません。」
「どうやってやりますか?」
「最初はダンプ トラックに荷物を詰めていました。ダンプ トラックが一番大きいからです。その後、ダンプ トラックに詰めるのに十分な砂がないとわかると、より小さな車に乗り換えました。そしてさらに小さな車に乗り換えました。」
「実際、これは非常に似ています。数値 355 10を 8 進数に変換してみましょう。」
「まず、それを 64 (8 2 )で割って5 を求め、余りは 35 です。これは、数値の最初の桁が 5 であることを意味します。次に、余りを 8 (8 1 )で割って、余りを 4 として得ます。したがって、数値 543 8が得られます。」
「ちなみに、反対方向に移動することもできます。結局、 543 8 == 5*64+4*8+3 == ((5)*8+4)*8+3 です。私たちの 8 進数の 10 " と "百" は 8 で割る必要があります。したがって、8 で割った余りが 8 進数になります。」
「まず、355 を 8 で割ってみましょう。余りが 3 の 44 が得られます。つまり、355=44*8+3 です。そして、44 は 5*8+4 と表すことができます。つまり、355= (5*8+ 4)*8+3; 数字は 5、4、3 です。探している数字は 543 8です。」
「理解できたと思いますが、すべてを完全に理解するには少し練習する必要があります。」
「プログラミングでは、異なる基数 (つまり、番号付けシステムで使用される桁数) の数値を使用することがよくあります。最も一般的なのは、2、8、10、16、および 64 です。」
「しかし、なぜこれが必要なのでしょうか? なぜ 2 桁、8 桁、16 桁、または 64 桁で表される数字が必要なのでしょうか?」
「これはプロセッサが内部でどのように動作するかということです。非常に単純化すると、電流がワイヤを流れている場合、その値は 1 であると言います。電流が流れていない場合、その値は 0 です。すべての数値はメモリ セルに格納されます。これらの値は、セルは非常に基本的な設計になっており、0 か 1 しか格納できません。」
「しかし、このような単純化(0 か 1 のみ)により、プロセッサとメモリ内の要素を非常に小さくすることが可能になりました。最新のプロセッサとメモリ モジュールには、何十億もの異なる要素が含まれています。そして、それらの面積は、多くの場合、1 平方センチメートル以下です。」
「ああ、もうわかったよ。」
「ここで 2 進数に移ります。ここでは 8 進数の場合と同じことができますが、簡単なだけです。」
1) 数字を書くには 2 桁が使用されます: 0、1。
2) 数字 101 2 は、 1*2 2 + 0*2 1 + 1*2 0を意味します。つまり、1*4+0*2+1*1 =4+1=51 10となります。
「はい。覚えています。0 または 1 の値を持つ 1 つのセルはビットと呼ばれます。しかし、それほど多くの情報を格納できるわけではないので、8 個のグループに結合されます。これらのグループはバイトと呼ばれます。」 」
「その通りです。バイトは 8 ビットのグループです。バイトには、次の値を格納できます: 00000000、00000001、... 11111111。これらの値は、10 進数 0、1、... 255 に対応します。これにより、合計が得られます。 256 の値です。」
Java の最大の整数は何ですか? というか、その種類は何ですか?
"long です。long は 8 バイトで構成されます。つまり 64 ビットです。-2 63から 2 63 -1までの値を格納できます。
「はい。数値を 10 進数から 2 進数に、またはその逆に変換する方法については触れません。そうしないと、レッスンが長すぎます。」
「代わりに、16 進法についてもう少しお話しましょう。」
「はい、とても興味深いですね。2 進法と 8 進法では、それぞれ 2 と 8 から始まる数字を単純に削除しました。しかし、ここで何をするのでしょうか? 新しい数字を追加しますか?」
「そのとおりです!これを見てください。」
1)数字を書くには 16 桁が使用されます: 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
2)数字 543 16 は、5*16 2 + 4*16 1 + 3*16 0を意味します。つまり、5*256+4*16+3*1 = 1280+64+3 = 1347 10となります。
「つまり、数字として文字を追加しただけですか? O_o」
「そう。それで、何が大事なの? 文字は完璧に機能するのに、なぜ新しい数字を発明するの? チェックしてみてください。」
16進数 | 10 進数値 |
---|---|
0 | 0 |
1 | 1 |
8 | 8 |
9 | 9 |
あ | 10 |
B | 11 |
C | 12 |
D | 13 |
E | 14 |
F | 15 |
「10 進数から 16 進数への変換についても話すつもりはありません。しかし、興味深い事実が 1 つあります。16 進数の数字は、0 から 15 までの値を持つちょうど 4 ビットで表されます。つまり、1 バイトは 8 つの 2 進数で書き込むことができます。」 (0 または 1) または 2 つの 16 進数。」
「ここに例があります:」
10進数 | 2進数 | 16進数 |
---|---|---|
0 | 0000 0000 | 00 |
1 | 0000 0001 | 01 |
15 | 0000 1111 | 0f |
16 | 0001 0000 | 10 |
31 | 0001 1111 | 1f |
32 | 0010 0000 | 20 |
128 | 1000 0000 | 80 |
129 | 1000 0001 | 81 |
255 | 1111 1111 | ff |
「16 進表現は簡単に 2 進数に変換できます (またその逆も同様です)。そのため、プログラミングでは数値の内部バイト表現が 2 進数 (0 と 1 を使用) で与えられることはほとんどありません。それは長すぎて理解するのが困難です。はるかに読みやすく、コンパクトです。」
「同感です。私でも気に入りました。」
「ところで、Java では、さまざまな番号付けシステムで数値をコード内に直接記述することができます。」
ベース | 特徴 | 例 | 無効な番号 |
---|---|---|---|
2 | 番号の先頭に0b | 0b 00001111 | 0b 11111 2 1 |
8 | 数字の先頭に0 | 0 1234343 | 0 12 8 |
10 | なし | 95459 | 909a _ |
16 | 数値の先頭に0x | 0x 10ff | 0x 1c gh |
「素晴らしい授業でした。ありがとう、ビラーボ。」
GO TO FULL VERSION