Positional notation

進位制

資訊社社課[?]

  • 現在國中小好像很少提,導致沒人會二進位
    • 對,剛去輔導完演算法小社的我忽然意識到這件事情,所以就講了
  • 學會後能幹嘛?
    • 看懂以前看不懂的怪數字
    • 和人溝通
    • 看 hex 色碼比較輕鬆 可能
  • 最主要是我發現複雜度要講的東西沒那麼多

為什麼講這個

從十進制開始

Decimal.

  • 從原始人的想法出發
    • 在沒有數字觀念的情況下,表達數量?
  • 開始掰你的手指頭
    • 用完手指?
  • 開始用你的腳指
    • 用完腳指?
  • 撿幾根地上的樹枝來用吧
  • 一定要那麼具體嗎?

計數

  • 把它用 畫/寫 的方式記錄下來!
  • 是多少就畫幾條線
    • :我今天捕了 |||||||||||||||||| 條魚喔
    • :真的喔,你倒是說給我聽聽啊
  • 要畫的線好像有點多欸
  • 我們不如用一個 X 代表 |||||||||| 吧
    • 人有 |||||||||| 根手指頭

濃縮

  • 但是...
    • :我今天又捕了 XXXXXXXXXX 條魚
    • :?
  • 使用新的符號 O 代表 XXXXXXXXXX
    • :我今天又捕了 OOOOOOOOOO 條魚
    • :你夠了喔
  • 每次都發明一個新的符號好煩喔

濃縮

  • 首先,我們分別用 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 代表 |, ||, |||, ||||, |||||, ||||||... (下略)
  • 當數字超過 9 時,將它濃縮
    • 我們不開新的符號,而是以它的位置表示它被濃縮過幾次
    • 10 的 1 代表它被濃縮過 1 次
    • 100 的 1 代表它被濃縮過 2 次
    • 2000 的 2 代表有 2 個被濃縮過 3 次的 1

抽象化

  • 原始生活結束,你是現代社會公民了
  • 十進位的數學應該很熟吧?
    • 四位數 abcd = a * 1000 + b * 100 + c * 10 + d * 1
    • abc0 = abc * 10
    • abcd % 100 = cd
    • ...
  • 你各位考進建中我相信數學沒一個差的
    • 四則運算什麼的沒問題的啦

現代人

練習題

1 + 1

練習題

9 \times 12

練習題

5 \% 3

二進位

Binary.

  • 為什麼人類通常使用十進位?
    • 你有十根手指、十根腳指
  • 其他動物在抗議
  • 十不具有像是 0, 1 等數強大的性質
    • 難道我們要用 1 進位?
    • 這樣有進位和沒進位一樣 = =

討厭十進位

  • 既然十本身是個很醜的數字,不如使用其他性質更好的
  • 既然 1 不行,2 可以嗎?
    • 以長度來說,確實簡短了不少
    • 只有 1, 0 兩種符號
    • 10 進位(誤
  • 同時 2 進位還具備一些特別好的性質,讓我們在資訊科學裡喜歡用它

替代方案

  • 一件事通常會有「正」「反」兩面
    • 我「有」筆
    • 我「沒有」筆
    • 我「支持」某候選人
    • 我「不支持」某候選人
    • 你「應該」做某件事
    • 你「不應該」做某件事
  • 正、反在敘述的過程中經常扮演關鍵的字眼
  • 不如用 1, 0 分別代表正反

兩極化

  • 更重要地,比起測量電流大小之類可能會有誤差,如果用是否有電流代表 1, 0 會精確很多
  • 很多東西都用 1, 0 表示會方便很多
  • 除非你精通數學物理資訊三科,掌握開發量子電腦的技術並發展出更強大的電腦,否則目前的電腦都是以二進位為基礎

電流

  • 2 進位的規則很簡單,超過 2 就進位,和你用10 進位一模一樣
  • 舉個例子 1 + 1 = 10 (Binary)
  • 之前我們在十進位我們叫每個數字的單位是「位」,到二進位我們有時稱它「位元」
  • 為了區分十進位 / 二進位的數字,我們經常在二進位前面加上 0b

計算

練習

0b1101\ to\ decimal

練習

11\ to\ binary

練習

0b11 + 0b10

練習

0b11 \times 0b110
  • 觀察到一些十進位的性質換到二進位上
    • 0b110101 = 0b100000 + 0b10000 + 0b100 + 0b1
    • 0b1010 = 0b101 * 0b10
    • 0b10101 % 0b10 = 0b1 
  • 所以,當我們處理二進位的數時,對每個位元分開來做會比較好做
  • 乘以某個 2 的 x 次方相當於左移 x 位
  • 取 2 的 x 次方的餘數相當於取後面幾個位元

其他性質

  • 剛剛提到 1, 0 也可以代表是或否 (布林值)
  • 我們定義在邏輯上的一些運算方法:
  • 比較特別的還有 not 運算子,會把 1 變成 0,0 變成 1

真值表

and 0 1
0 0 0
1 0 1
or 0 1
0 0 1
1 1 1
xor 0 1
0 0 1
1 1 0
  • 對於每個位元做上面講的邏輯運算

位元運算

    0b 1 0 0

& 0b 1 1 0

    0b 1 0 0

    0b 1 0 0

|  0b 1 1 0

    0b 1 1 0

    0b 1 0 0

^  0b 1 1 0

    0b 0 1 0

  • 上面三個分別代表 4 & 6 = 4, 4 | 6 = 6, 4 ^ 6 = 2
  • 剛剛介紹完位元運算,接著要來講實際使用的部分
  • 首先是位元遮罩
    • 當想要對其中幾個位元做操作時使用
    • 取 0b1000 的餘數:& 0b1111
  • 移動:乘除法,或單純想要移動位元時用
    • 0b1 << 1 = 0b10 ,相當於 * 2
    • 0b11 >> 1 = 0b1,相當於 / 2 後向下取整
  • 搭配在一起
    • x << 1 | 1,相當於 * 2 + 1

位元遮罩 / 移動

十六進位

Hexadecimal.

  • 因為二進位的數通常比較長,我們希望能縮寫
  • 因此十六進位出現了
  • A, B, C, D, E, F 分別代表 10, 11, 12, 13, 14, 15
  • 常見的色碼 0x3a10fc 等就是十六進位
    • R, G, B 各佔兩位,數值從 0 ~ 255
  • 怎麼縮寫?
    • 每四個位元縮寫成一個數字
    • 0110 1001 1110 1100
    •       6       9       E       C

人生而懶惰

  • 縮寫的方式
  • 原本每位是 0b10000, 0b1000, 0b100, 0b10, 0b1
  • 現在每位是 0b1 0000 0000, 0b1 0000, 0b1
  • 很自然地就縮起來了
  • 同樣的道理可套用在 8 進位上

為什麼

Made with Slides.com