day04 必備基礎知識

凫弥發表於2024-09-17

day04 必備基礎知識

今日概要

  • 進位制
  • 單位
  • 編碼

1.進位制

1.1 烽火狼煙

  • 古代打仗用烽火狼煙來進行傳遞訊號
  • 生活中燈泡的亮與暗用來指示資訊(用電來抓耗子,燈亮表示抓到了)

image-20200604182524790

用亮燈用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])
}

總結

本章的知識點屬於理解為主,瞭解這些基礎之後有利於後面知識點的學習,接下來對本節所有的知識點進行歸納總結:

  1. 計算機上所有的東西最終都會轉換成為二進位制再去執行。
  2. ascii編碼、unicode字符集、utf-8編碼本質上都是字元與二進位制的關係。
    • ascii,字元和二進位制的對照表。
    • unicode,字元和二進位制(碼位)的對照表。
    • utf-8,對unicode字符集的碼位進行壓縮處理,間接也維護了字元和二進位制的對照表。
  3. ucs2和ucs4指的是使用多少個位元組來表示unicode字符集的碼位。
  4. 目前最廣泛的編碼為:utf-8,他可以表示所有的字元且儲存或網路傳輸也不會浪費資源(對碼位進行壓縮了)。
  5. 二進位制、八進位制、十進位制、十六進位制其實就是進位的時機不同。
  6. 一個位元組8位
  7. b/B/KB/M/G的關係。
  8. utf-8用3個位元組表示中文。

參考文件:https://pythonav.com/wiki/detail/1/80/

相關文章