Skip to content

Latest commit

 

History

History
106 lines (73 loc) · 5.16 KB

4.05.md

File metadata and controls

106 lines (73 loc) · 5.16 KB

セクション 4.5: 数値システム

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

10進数を16進数や2進数へ変換する計算機

ここで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)
}

playground