contributed by < sammer1107
>
進階電腦系統理論與實作
man == 0
) 或 NaN(man != 0
)。infinity 的話也可以直接回傳。但 NaN 的部份應該更加小心,因為 mantissa 只要不為 0 就算 NaN
& 0xffff0000
來去除低位的 bit 才對。x
的 mantissa 歸 0 變成 r
。e.g. 0x000080000
這個位置,也就是 bfloat16 範圍外的第一個 bit),加上 r
之後就會進位。要注意這裡 r
是浮點數型態,所以除以 256
不是單純向右移,而是把 exponent 減 8 。 e.g.NEXT_START_INDEX
的功用在於找到 start
的下一個位置,這其實就是 start+1
,除了當 start
在最後一格時,要繞回來 0 。NEXT_END_INDEX
同理。所以兩個答案都為 1。do {...} while(0)
來把這些 statement 包起來,來讓整個東西變成一個 regular statement。{...}
)而且他是以 ;
作為結尾,這讓他跟 expression statement 很類似,而一般的函式呼叫就是屬於 expression statement。TODO: 用 dangling else 的處置來回覆本題
jserv
這題為一個 singly-linked list 加上對應的 insertion sort 的實作。
先看 llist
與 cons(x,y)
的定義:
首先這題用到 compound literal 的技巧,根據 c standard:
A postfix expression that consists of a parenthesized type name followed by a brace-
enclosed list of initializers is a compound literal. It provides an unnamed object whose value is given by the initializer list.
也就是長這樣的東西:( type-name ) { initializer-list }
struct llist[]
,initializer-list 就是 {y,x}
,用來初始化這個 array of struct llist 的第0個元素(其中 y
用來初始化 val
,x
初始化 next
),而整個 array 也就只有一個元素。cons(x,y)
會成為一個 lvalue,array 會被轉成 pointer,可以再被傳入下一層 cons
作為初始值。(struct llist){y, x}
來創造一個 struct llist
,對他取址,再用這個地址初始化一個 struct llist*
。如此同樣可以達成一樣的效果。void sort(struct llist **head)
這裡為 insertion sort 的主體,迴圈做的事就是逐點走訪 linked list,把每個節點利用 sorted_insert()
來把這個節點加到已排序好的 list。
void sorted_insert(struct llist **head, struct llist *node)
數字 | binary |
---|---|
1 | 001 |
2 | 010 |
3 | 011 |
4 | 100 |
各位置 1 出現的次數 | 122 |
numSize-1
:
c1
,一邊計算陣列中的數字裡 1 出現的次數 c2
。最後比較 c1 < c2
就知道重複的數字在這個位置上是不是 1 了。如果是,就在 res 把對應的 bit 設為 1。nums
次,時間複雜度為 ,換來的則是 的空間複雜度。現有的實作可透過增加一個長度 的陣列來累計每個位置的 c2
,如此只要完整走訪整個陣列一次,在每個數字則利用 gcc extension 加速。如此用 的儲存空間換取到更短的時間。
另外一點是,c1
事實上可以直接計算而不必實際走訪 來累計。觀察以下二進位表,就可以發現規律。
Decimal | Binary |
---|---|
0 | 000 |
1 | 001 |
2 | 010 |
3 | 011 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
首先 和 的累計是一樣的。再來第 0 個 bit 是 2 個數字作為一個周期變化,每兩個數字中有 1 個為 1 。第 1 個 bit 則是 4 個數字成為一個周期,每 4 個數字中有 2 個為 1 。 | |
如此根據 n ,我們可以計算出 bit 的累積結果: | |
\begin{align} | |
\floor{\frac{n}{2^{i+1}}} 2^i + \max(n\bmod{2{i+1}},2i)-2^i | |
\end{align} |
Code
nums
來統計各 bit 的累計次數。其中用到與 quiz3-Bitmap 一樣的技巧,利用 ctz 來避免檢查每一個 bit 位置。c1
後,比較 c1
與 c2
來設定 res
比較結果
測試程式
這裡測資的產生並不夠隨機,所以比較結果可能不公平,畢竟新方法會受到 set bit 數量而影響速度。
但平均來講新方法還是會比較快才對。