計組初探,神奇的二進位補數
就像之前提到的
組合語言單看書真的是讀不下去了
所以又換了一門
號稱資工系三大必修之一
計算機組織與結構
一開始當然也是借書來看
雖然已經是借中文書
但還是不知道在說什麼
最後還是得上網找開放式課程
這次是交大的李逸朗老師所開設的
書上輕描淡寫帶過的重點
老師都會鉅細靡遺的講解前因後果
舉幾個例子
第一個就是二進位補數系統
很久很久以前就聽過二進位補數
但不知道為什麼要使用這個系統
原來是因為二進位補數只有一個零
沒有正負0
以計算機的角度來說
有很多狀況要考慮是否等於零
使用二進位補數
可以避免兩個0的問題
另外一個二進位補數的好處
就是做a+b減法時
只要做a+ “b的補數”就可以了
還可以判斷是否有溢位
好處多多
加減法相對容易理解
但是乘除法就難上許多了
因為在cpu內沒有什麼乘法器除法器
所以實際上乘法是透過連續加法
加上用shift達到進位的目的
達到乘法的效果
當然還有一個最基本又最難的
就是浮點數啦
據說大部分人都會有”我懂浮點數”的幻覺
到現在我也還是懵懵懂懂的
之前看過很多種版本的浮點數介紹
但是同時介紹浮點數
又介紹浮點數在cpu的運算原理
就真的少之又少
這也是第一次了解到
浮點數的假數部分
為什麼要加上偏移值
就是因為要讓假數的部分變成unsign
如此在比大小的時候
才不用考慮正負數的問題
運算才會快
這也是我對unsign的新理解
還有各種ALU的判斷
沒有先看過數位邏輯
真的是有一點點吃力
要看懂各種and or xor 閘
另外就是重點中的重點
指令集的設定
固定就是32bit的指令長度
該留多少給操作碼
留多少給多少指令
一樣是各種trade off
各種magic number
和看作業系統的感覺一樣
前人的心血結晶啊
反觀最近上班的專案
自己的寫的東西就真的很小兒科QQ
不過好處就是大部分需求都在掌握當中
除了一個比較難的問題
就是解決layouy的衝突問題
我們App是做討論區
由於單篇文章內容有很多區塊
包含發文者,日期,內容
圖片,按讚,留言數等等資訊
畫面上其實滿複雜的
之前其實就有發現
載入文章頁面時
console視窗就會跳出一大段錯誤提示
警告你的layout衝突了
並且自動把某條constraint刪除
所以畫面上看起來都正常
其實是底層的系統幫你處理好了
這個問題說會沒影響就沒影響
畢竟使用者看不到錯誤log
說有影響也是有影響
苦主就是我自己
每次debug都要被一堆雜訊干擾
所以這一期排了一些時間
來解決這個問題
沒想到還真的不好解決
因為文章的高度
會隨著內容的長度有變
再加上有圖片和沒有圖片的考量
以及放在tableView裡面的影響
花了很多時間下去修正
錯誤log還是不留情的給你刷一整排
跟熱門實況主的聊天室一樣
可惜我不是實況主
沒辦法ban人
程式就是這麼無情
錯就是要告訴你
搞了半天沒有成果
最後一個惱羞成怒
清除所有constraint
從畫面的最上面開始重新拉過
拉到看哪一個爆衝突
就去解決它
又多花了三四個小時
才終於解決
最後結論就是
往下的constraint的優先度要調降為999
一路往下拉上去
就可以正常長出來囉
不過本篇的重點不是講解決衝突
而是同事分享的”用視覺化的程式碼拉layout”
簡單來說就是長得像下面這個樣子
let horizontal = “H:|-40-[centerView]-100-|”
let vertical = “V:[centerView]-120-|”
就是剛剛說的會報錯的系統訊息格式
如果不是同事分享
還真的沒想過可以這樣拉
不過會這樣做當然是有原因的
因為他們開發的是跨專案的模組
而Storyboard在跨專案時
通常會發生一些未知的bug
所以才傾向用code生成畫面
並且也用code生成Constraint
一般專案還是建議直接在畫面上拉
不過還是分享一下
真的滿厲害的