day04 必備基礎知識
今日概要
- 進位制
- 單位
- 編碼
1.進位制
1.1 烽火狼煙
- 古代打仗用烽火狼煙來進行傳遞訊號
- 生活中燈泡的亮與暗用來指示資訊(用電來抓耗子,燈亮表示抓到了)
用亮燈用1表示,則上述的情景為:
-
110010
-
010100
-
100001
計算機本質上都有由電晶體和二極體組成(類比為燈泡),亮與滅都代表一定的資訊,所以,本質計算機的所有操作:0101010。
為這些“10101010”來進行一定的格式化:
0
1
10
11
100
所以,二進位制,滿2進1.
小結
- 計算機的底層本質上都是二進位制。
- 八進位制、十進位制、十六進位制、二進位制之間有對應關係。
- 滿N進1位
2.單位
計算機中表示對於二進位制大小的常見單位有:
-
b(bit),位
表示二進位制有多少位,例如: 01101 就是 5位 = 5b 011011010 就是 9位 = 9b
-
B(byte),位元組
8位就是1個位元組,例如: 10100101 就是 8位 = 8b = 1B= 1個位元組 1010010110100101 就是 16位 = 16b = 2B= 2個位元組
-
KB(Kilobyte),千位元組
1024個位元組就是1千位元組(1KB),即: 1 KB = 1024 B = 1024*8 b
-
M(Megabyte),兆
1024個千位元組就是1兆(1M),即: 1M = 1024 KB = 1024 * 1024 B = 1024 * 1024 * 8 b
-
G(Gigabyte),千兆
1024個兆就是1千兆(1G),即: 1G = 1024 M = 1024 * 1024 KB = 1024 * 1024 * 1024 B = 1024 * 1024 * 1024 * 8 b
-
T(Terabyte),萬億位元組
1024個G就是1T
-
…其他更大單位 PB/EB/ZB/YB/BB/NB/DB 不再贅述。
學完上面的這些單位之後,是不是就瞭解了平時大家說的自己有1G流量是啥意思了。
生活中的場景:
- 電腦的記憶體 4G
- 硬碟是1T
- 流量10G
- 流量有30M
3.編碼
計算機底層本質都是二進位制。
3.1 ascii編碼
最多用二進位制的8來表示所有的情況。
0000000
0000001
0000010
0000011
0000100
....
...
11111111
2**8=256
A --> 按照ascii碼對照表找到他對應的二進位制 01000001
3.2 unicode(萬國碼)
-
ucs2,用16位來表示所有的情況。2**16=65535
十六進位制 0000000 0000000 0000000 0000001 0000000 0000010 0000000 1111111 ... 0025 % 6B66 武 ... 11111111 11111111
-
ucs4,用32位來表示所有的情況。2**32=4294967296
0000000 0000000 0000000 0000000 ... 0000000 0000000 0000000 11111111 ... 11111111 11111111 11111111 11111111
忠告:ucs2和ucs4應該根據自己的業務場景來進行選擇。
3.3 utf-8編碼
對unicode進行壓縮,到底是如何壓縮?
-
第一步:找模板
碼位範圍(十六進位制) 轉換模板 0000 ~ 007F 0XXXXXXX 0080 ~ 07FF 110XXXXX 10XXXXXX 0800 ~ FFFF 1110XXXX 10XXXXXX 10XXXXXX 10000 ~ 10FFFF 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX 例如: "B" 對應的unicode碼位為 0042,那麼他應該選擇的一個模板。 "ǣ" 對應的unicode碼位為 01E3,則應該選擇第二個模板。 "武" 對應的unicode碼位為 6B66,則應該選擇第三個模板。 "沛" 對應的unicode碼位為 6C9B,則應該選擇第三個模板。 "齊" 對應的unicode碼位為 9F50,則應該選擇第三個模板。
注意:utf-8表示中文時,用的是3個位元組。
-
第二步:碼位以二進位制展示,再根據模板進行轉換
碼位拆分: "武"的碼位為6B66,則二進位制為 0110101101100110 根據模板轉換: 6 B 6 6 0110 1011 0110 0110 ---------------------------- 1110XXXX 10XXXXXX 10XXXXXX 使用第三個模板 11100110 10XXXXXX 10XXXXXX 第一步:取二進位制前四位0110填充到模板的第一個位元組的xxxx位置 11100110 10101101 10XXXXXX 第二步:挨著向後取6位101101填充到模板的第二個位元組的xxxxxx位置 11100110 10101101 10100110 第二步:再挨著向後取6位100110填充到模板的第三個位元組的xxxxxx位置 最終,"武"對應的utf-8編碼為 11100110 10101101 10100110
除了utf-8之外,其實還有一些其他的 utf-7/utf-16/utf-32 等編碼,他們跟utf-8類似,但沒有utf-8應用廣泛。
編碼答疑
/*
@Author:武沛齊 微訊號:wupeiqi666
@Description: 老男孩IT教育 & 路飛學城
@Video: https://space.bilibili.com/283478842
*/
package main
import (
"fmt"
"strconv"
)
func main() {
// 定義字串,字串是以什麼形式存在於Go編譯器(utf-8編碼)
name := "武沛齊"
// 其他語言:
// 0 武
fmt.Println(name[0], strconv.FormatInt(int64(name[0]), 2)) // 230 11100110
fmt.Println(name[1], strconv.FormatInt(int64(name[1]), 2)) // 173 10101101
fmt.Println(name[2], strconv.FormatInt(int64(name[2]), 2)) // 166 10100110
// 1 沛
fmt.Println(name[3])
fmt.Println(name[4])
fmt.Println(name[5])
// 2 齊
fmt.Println(name[6])
fmt.Println(name[7])
fmt.Println(name[8])
}
總結
本章的知識點屬於理解為主,瞭解這些基礎之後有利於後面知識點的學習,接下來對本節所有的知識點進行歸納總結:
- 計算機上所有的東西最終都會轉換成為二進位制再去執行。
- ascii編碼、unicode字符集、utf-8編碼本質上都是字元與二進位制的關係。
- ascii,字元和二進位制的對照表。
- unicode,字元和二進位制(碼位)的對照表。
- utf-8,對unicode字符集的碼位進行壓縮處理,間接也維護了字元和二進位制的對照表。
- ucs2和ucs4指的是使用多少個位元組來表示unicode字符集的碼位。
- 目前最廣泛的編碼為:utf-8,他可以表示所有的字元且儲存或網路傳輸也不會浪費資源(對碼位進行壓縮了)。
- 二進位制、八進位制、十進位制、十六進位制其實就是進位的時機不同。
- 一個位元組8位
- b/B/KB/M/G的關係。
- utf-8用3個位元組表示中文。
參考文件:https://pythonav.com/wiki/detail/1/80/