contributed by < StevenChou499
>
1
延伸第 3 週測驗題的測驗
7
,已知輸入必為大於0
的數值 (即x > 0
),以下程式碼可計算,,也就是 ceil 和 log2 的組合並轉型為整數:請補完,使其行為符合預期。作答規範:
EXP1
應以最簡潔的形式撰寫,且符合作業一排版規範 (近似 Linux 核心程式碼排版風格)EXP1
為表示式,限制使用^
,&
,|
,<<
,>>
這幾個運算子,可能會出現常數EXP1
不該包含小括號 (即(
和)
)- 為了自動批改的便利,變數出現的順序 (可從缺) 從左到右為
r
,shift
,x
EXP1
不可包含,
和;
這樣的分隔符號 (separator)
本題與測驗3的第 7
題其實非常相似,前面之時做方法其實都是相同的,只是因為這次需要搭配計算的是 ceil 的方式, 因此一開始需要先將數字 x
減 1
,最後在計算完之後再加上 1
,以避免在計算以 2
為底的對數時少算。而因為 EXP1
只需要計算最後一位,不需要經過計算相加並儲存,其值為 r | shift | x >> 1
。
EXP1 : r | shift | x >> 1
2
複習〈你所不知道的 C 語言: bitwise 操作〉,改寫第 3 週測驗題的測驗
11
裡頭的 fls 函式 (fls 意謂 "find last set"),使其得以計算 Find first set:請補完,使其行為符合預期。作答規範:
EXP2
和EXP3
應以最簡潔的形式撰寫,且符合作業一排版規範 (近似 Linux 核心程式碼排版風格)
EXP2
和EXP3
限制使用 ^, &, |, <<=, >>=, +=, -= 這幾個運算子,可能會出現常數
EXP2
和EXP3
不該包含小括號 (即(
和)
)
為了自動批改的便利,變數出現的順序 (可從缺) 從左到右為x
,o
,t
,shift
,也就是說,你應該寫x ^ t
而非t ^ x
EXP2
和EXP3
不可包含,
和;
這樣的分隔符號 (separator)
3
考慮以下改寫自 Linux 核心的程式碼:
請補完,使
consumer_del
行為符合註解規範。作答規範:
EXP4
和EXP5
應以最簡潔的形式撰寫,且符合作業一排版規範 (近似 Linux 核心程式碼排版風格)
2.EXP4
和EXP5
都包含指標操作 (如->
)
題目使用了 pointer to a pointer
的方式循序訪問各個 foo_consumer
,並比較之後若相同則刪除該 foo_consumer
,回傳 true
。因此 EXP4
之值應該為讓 for
迴圈跳往下個 foo_consumer
的 con = &(*con)->next
,而 EXP5
之值應該為 con = &(*con)->next
,才可以跳過想要刪除的點而直接連接至下一個 foo_consumer
。
EXP4 : con = &(*con)->next
EXP5 : con = &(*con)->next
4