# linux2021: Louis208908 ## γ-1 在使用fork開一個新行程的時候,他的buffer也會被保留(因為我們沒有flush buffer),也就是說在之前的父行程當中已經累積在buffer的東西,也被帶進了新的子行程的buffer 所以**在fflush之前**,**每一個行程**內都會累積 NNN個 “–“ 而經過這一整個迴圈,我們會建立總共2^NNN個行程,也就是說我們會有每個buffer的NNN個"-",總共NNN * 2^NNN 這麼多個 “-“ ## β-1 首先我們先將要alignment - 1並對其做**bit flip**我們就可以得到一個真正的mask,當我們對任何想要對齊的數字跟這個mask做**bitwise AND**之後,可以發現,得到的結果必定會是alignment的倍數。 而再來我們要處理round up的部分,我們製作一個offset並令其為alignment - 1。 假設今天要對齊的這個數字已經屬於alignment的倍數,也就代表從二進位的角度下來看,該數字加上了offset也不會有進位的問題,因此之後這些多餘的offset在進行了bitwise AND之後就不見了。 反之,如果今天要對齊的這個數字她不屬於alignment的倍數,那麼在加上了offset之後,他會需要進一位,而剩下的數字會在bitwise AND之後被消去,如此我們就得到了align up之後的新位置。 ### 舉例 **使用一個8 bits為例** 令alignment 為 **4** mask 為 ~(alignment - 1)以二進位表示,也就是 **1100** offset 則會是 **00000011** 如今隨意假設一個數字sz 若sz 為alignment的倍數,則sz為 **XXXXXX00** 將這兩個數字相加並不會有進位的問題,因此我們會得到原本的sz 而如果sz不為alignment的倍數,則sz有三種可能 1. **XXXXXX01** 2. **XXXXXX10** 3. **XXXXXX11** 在這三種情況之下,無論是哪一種與offset相加之後都會產生進位,得到 XXXXX(X+1)YY,而將新得到的這個數字與mask做bitwise AND之後 YY 會被消去,因此我們得到了align_up的位址 ## α題答案 這邊是要我們在給定一待旋轉數字V、旋轉次數C,實作出rotl 跟 rotr。 首先顯而易見的部分是V << C的部分,但是在提供的程式碼當中還有進行兩個額外的動作,也就是先做出一個mask = bits - 1,並且將C &= mask 這個動作是要防止旋轉次數C 大於實際上擁有的最長bits 而LLL 跟 RRR的部分,最一開始我的想法是 V 右/左移 bits - c 但這樣會違反限制,用到了bits的部分,並且我們也沒有檢查到C 大於實際上擁有的最長bits這一件事 因此我們也需要做類似的檢查,我下一題align_up的bitwise operator的啟發,若我先將C - 1 在做bitflip 得到一個mask2 之後將這個mask2 跟我們前面得到的mask 做 bitwise AND,那它會有跟相減一樣的效果,而如果C 比bits還要大,在做了這個bitwise AND之後較大的部分也全部因為AND效果而變成0,因此我們就可以確保我們的C就算比bits還要大,也不會產生錯誤。 由此,我的LLL跟RRR 分別得到 1. LLL = (v >> (~(c - 1) & mask) 2. RRR = (v << (~(c - 1) & mask) :::warning 請撰寫更精簡的實作 :notes: jserv :::