# 2024q1 Homework2 (quiz1+2)
contributed by < `dockyu` >
## 第一週測驗題
### 測驗 1
```c
node_t *list_tail(node_t **left)
```
要取得最後一個,所以 while 迴圈裡一定是一直將 `*left` 指到下一個,所以當沒有跳出迴圈情況就要將
```c
left = &((*left)->next);
```
```c
int list_length(node_t **left)
```
也是要<s>遍歷</s> 整個鏈結串列,所以思路也是一樣的
:::danger
注意用語。
$\to$ [資訊科技詞彙翻譯](https://hackmd.io/@sysprog/it-vocabulary)
:::
### 測驗 2
:::danger
改進你的漢語表達。
:::
merge_force_collapse 檢查三個連續的 run ,如果 A<C 如果不符合就執行 merge_at 將中間run 作為輸入,否則將第三個作為輸入
merge_at 會呼叫 merge 合併目前的 run 和前一個 run
,而 merge 其實就是一直比較兩個 run 看哪一個比較小
所以 tail 應該要一直間接指到合併的鏈結串列的結尾,初始值 `AAAA` 為 `&head`
接著每次找到小的都會接在後面並*指到下一個*所以 `BBBB` 跟 `CCCC` 分別是 `&a->next` `&b->next`
:::success
我覺得如果將指到下一個的功能移出判斷式,看起來會更簡潔
```c
tail = &(*tail)->next
```
:::
build_prev_link 的功能就是把剛剛拆開的鍊結串列重新組裝回一個完整的 doubly-linked list,前面的迴圈將中間的節點都修好,剩下頭尾還沒相接
`DDDD` 是 `tail->next`
`EEEE` 是 `head->prev`
stk 用來儲存 run ,如果 stk_size 只有1就代表已經何排序完成,要將鍊結串列變回 linux kernel 的格式了
<s>`FFFF` 為 `1`</s>
:::danger
不用列出參考題解,專注於程式碼原理、你的洞見,還有你所發現的實作缺失。
:::
---
## 第二週測驗題
[第二週測驗題](https://hackmd.io/@sysprog/linux2024-quiz2#%E6%B8%AC%E9%A9%97-3)
### 測驗 1
<s>`AAAA` 為 `h->next` 跟 lab0 的 list_add 一模一樣</s>
:::danger
不用列出參考題解,專注於程式碼原理、你的洞見,還有你所發現的實作缺失。
:::
hlist_for_each 是一個 macro 到最前面去看他的定義就知道第二個參數是要 head ,所以 `BBBB` 為 `heads`
每一個 hlist_node entry 都可以從 node 屬性回推 order_node 使用的是 `CCCC` `list_entry`
查看 hlist_add_head 就知道接受的第二個參數是 `struct hlist_head *` 型別,
<s>所以 `DDDD` 是 `heads`</s>
:::danger
不用列出參考題解,專注於程式碼原理、你的洞見,還有你所發現的實作缺失。
:::
### 測驗 2
get 跟 put 都是把目標 move 到 list 的 head
<s>
`EEEE` `next->pprev`
`FFFF` `link`
`GGGG` `pos`
`HHHH` `link`
`IIII` `pos`
`JJJJ` `link`
`KKKK` `pos`
</s>
:::danger
不用列出參考題解,專注於程式碼原理、你的洞見,還有你所發現的實作缺失。
:::
### 測驗 3
題目使用 Binary Search 來找到一個 long 裡第一個被設定的 bit 也就是一直判斷右半邊是不是0,因為 long 在不同架構下的長度不同,有可能是 64 或 32 bits 所以如果是 64 第一次就是判斷右邊32 bits ,所以 `AAAA` 是 `0xffffffff` 32 個為 1 的 bits
:::danger
無論標題和內文中,中文和英文字元之間要有空白字元 (對排版和文字搜尋有利)
:::
__clear_bit 函式將從 addr 儲存的位址開始數第 nr 個 bit 設為 0
BIT_MASK(nr) 回傳的是 nr 在一個 64 bits 中的位置
BIT_WORD(nr) 則是回傳處於第幾個 64 bits
知道目標 bit 在哪個位置之後就可以透過用 mask 做 and 操作的方式將它設為 0
:::danger
不要只是「舉燭」,你的洞見呢?
:::