16進数や10進数、2進数などの数値システムを見ていきましょう。
私達が日々生活するのに使っている数値システムは10進法ですね。なぜ10がベースなんでしょうか?きっと私達の指が10本だからじゃないでしょうか?
1000万の桁 | 100万の桁 | 10万の桁 | 1万の桁 | 1000の桁 | 100の桁 | 10の桁 | 1の桁 | |
---|---|---|---|---|---|---|---|---|
decimal | 107 | 106 | 105 | 104 | 103 | 102 | 101 | 100 |
128の桁 | 64の桁 | 32の桁 | 16の桁 | 8の桁 | 4の桁 | 2の桁 | 1の桁 | |
---|---|---|---|---|---|---|---|---|
binary | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
65536の桁 | 4096の桁 | 256の桁 | 16の桁 | 1の桁 | ||||
---|---|---|---|---|---|---|---|---|
hexadecimal | 167 | 166 | 165 | 164 | 163 | 162 | 161 | 160 |
|||||262144の桁|4096の桁|64の桁|1の桁| |------------|------------|--------|-----------------|-------------|---------|--------|----|----| |base64|647|646|645|644|643|642|641|640|
1、10、100、1000といった桁がテーブルにありますね。10進数ならば、ひとつの桁に10種類の数字が入ります。0~9です。例えば、1の桁に9があり、そこに1を足すと、10の桁に1、1の桁が0になります。10の桁に1、1の桁が0のときのことを10と表現しますね。12のことを言いたかったら10の桁に1、1の桁に2ということになります。この法則を理解すると、2進数や16進数が理解しやすくなります。
10進数はどのように動作するのでしょうか?それぞれの桁には1桁の0~9の10種類の数字が入ります。同じように、2進数では1つの桁に1桁の数字が入りますが、入る数は0と1の2種類です。16進数でも1つの桁に1桁の数字が入りますが、入るのは16種類の値です。
10から15までの数は2つの文字を使わなければいけないので、16進数では代わりにこの様にします。0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e
これで、1つの桁に保存できる数は違いますが、10進数と同じように2進数と16進数で数を表現する方法が分かりました。
それぞれのシステムでの数を見てみましょう。
decimal | binary | hexadecimal |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
5 | 101 | 5 |
10 | 1010 | a |
15 | 1111 | e |
50 | 110010 | 32 |
100 | 1100100 | 64 |
ここで2進数ジョークです。「世界には10種類の人間がいる。2進数を理解しているかいないかだ。」
42420を表現するためには万の桁に4、千の桁に2、百の桁に4、十の桁に2が必要です。
1000万の桁 | 100万の桁 | 10万の桁 | 1万の桁 | 1000の桁 | 100の桁 | 10の桁 | 1の桁 |
---|---|---|---|---|---|---|---|
107 | 106 | 105 | 104 | 103 | 102 | 101 | 100 |
4 | 2 | 4 | 2 | 0 |
42を2進数で表すとどうなるでしょうか?
128の桁 | 64の桁 | 32の桁 | 16の桁 | 8の桁 | 4の桁 | 2の桁 | 1の桁 |
---|---|---|---|---|---|---|---|
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
1 | 0 | 1 | 0 | 1 | 0 |
911を16進数で表すと?
65536の桁 | 4096の桁 | 256の桁 | 16の桁 | 1の桁 |
---|---|---|---|---|
164 | 163 | 162 | 161 | 160 |
3 | 8 | F |
16進数での数をを10進数(911)にするには、256を3倍し(768)、16を8倍し(128)、15(Fが表現している数)を1倍し(15)、それぞれを足し合わせます。768 + 128 + 15 = 911
これで10進数、2進数、16進数がどう動作するのか分かりました。Goではどのように扱うのか見ておきましょう。
package main
import (
"fmt"
)
func main() {
s := "H"
fmt.Println(s)
/* バイト列に変換する */
bs := []byte(s)
fmt.Println(bs)
/* bsの0番目をnの値とする */
n := bs[0]
fmt.Println(n)
/* nを出力 */
fmt.Printf("%T\n", n)
/* 2進数として出力 */
fmt.Printf("%b\n", n)
/* 16進数として出力 */
fmt.Printf("%x\n", n)
/* 16進数として出力(プレフィックス付き) */
fmt.Printf("%#X\n", n)
}