# 2024 Homework4 (quiz3+4) ## [第 4 週測驗題](https://hackmd.io/@sysprog/linux2024-quiz4) ### 測驗 1 [population count](https://en.wikichip.org/wiki/population_count) 用於計算二進位表示的數值中,有多少位元是 1,常見應例子有 sparse matric 或是 bit array 中非 0 的元素個數和計算兩個字串的 Hamming distance。 popcount_naive 透過不斷清除 LSB ,直到輸入 `v` 為零,以下為實作程式 ```c unsigned popcount_naive(unsigned v) { unsigned n = 0; while (v) v &= (v - 1), n = -(~n); return n; } ``` 這裡我以輸入 `v` = 111100 和 `v &= (v - 1)` 為例逐步說明 ``` step1 : v = 111100, (v-1) = 111011, 111100 &= 111011 , 此時 v = 111000, n = 1 step2 : v = 111000, (v-1) = 110111, 111000 &= 110111 , 此時 v = 110000, n = 2 step3 : v = 110000, (v-1) = 101111, 110000 &= 101111 , 此時 v = 100000, n = 3 step4 : v = 100000, (v-1) = 011111, 100000 &= 011111 , 此時 v = 000000, n = 4 Output is 4 ``` 而二補數系統中 `n = -(~n)` 是等同於 `n++`,我可拆解成以下表示形式 $-n =\ \sim n + 1$ $-(\sim n) = n + 1$ 這裡我們為 $n = -(\sim n)$ 帶個例子解釋,假設 $n = 0011$,那麼 $\sim n = 1100$,$-(\sim n) = 0100$,$-(\sim n)$ 就是在對 $\sim n$ 的結果加一。