---
# System prepended metadata

title: 'linux2021: Louis208908'

---

#  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
:::