contributed by < uccuser159
>
在calc
函式中式在做四則運算,考慮先乘除後加減的問題:
4 __ 4 __ 4 __ 4 (底線處放運算子 + . - . x . /)
根據op_to_prio
函式回傳的值與 0x0F 做 AND 運算:
(+ . -)應該得到的布林值為0; (x . /)得到的布林值為1
所以應該補入的程式碼為:
fitbits.c
) 可檢驗輸入的整數 x
是否可用 n
個位元來表示,例如 (x = 4, n = 9) 要回傳 true
, 當 (x = 4, n = 2) 回傳 false
。實作的程式碼不能有任何邏輯條件判斷 (如 if
, else
, ?
) 或迴圈 (如 for
, while
, goto
, switch
, case
, break
, continue
),可用的運算子是 >>
, <<
, -
, +
, !
, ~
, &
, |
請補完程式碼,作答時需要包含函式宣告及定義。除了撰寫程式,你應該提供對應的程式碼註解。
若 n=3 只要小於8的數字皆可以用3個位元表示;若 n=4 只要小於16的數字皆可以用4個位元表示,以此類推,要數字 x 可以被 n 個位元表示,則 。
所以補完的程式碼為:
is-less-equal.c
) 可檢驗輸入的整數 x
和 y
,是否存在 的關係。例如 (x = 4, y = 4) 要回傳 true
, 當 (x = 14, y = 9) 回傳 false
。實作的程式碼不能有任何邏輯條件判斷 (如 if
, else
, ?
) 或迴圈 (如 for
, while
, goto
, switch
, case
, break
, continue
),當然也不能用 >=
, >
, <
, <=
, -
等運算子。可用的運算子是 >>
, <<
, +
, ~
請補完程式碼,作答時需要包含函式宣告及定義。除了撰寫程式,你應該提供對應的程式碼註解。
用兩數相減來比較大小,若 s = y - x >= 0,則 s 的 MSB 為0;若 s = y - x < 0,則 s 的 MSB 為1。此處不能使用 "-" 運算子,故採用取2補數的減法。
所以補完的程式碼為:
考慮一種針對短字串的最佳化操作,假設字串總是小於等於 8 bytes,標的硬體是像 x86_64 這樣的 64-bit 架構而且是 little endian,於是我們可實作類似以下的程式碼 (ministr.c
):
這裡的 __builtin_clzll
是 GCC builtin function,作用是 bit scan,程式預期輸出為:
你應該要實作 calc
函式中標註 /* Write your code here */
之後的程式碼。除了撰寫程式,你應該提供對應的程式碼註解。
注意: 實作的程式碼不能有任何邏輯條件判斷 (如 if
, else
, ?
) 或迴圈 (如 for
, while
, goto
, switch
, case
, break
, continue
),也不能用 >=
, >
, <
, <=
, -
等運算子。
mini_strcat
函式要合併兩個mini_str
,str1Len
為str1
的長度。
tr2.integer <<= str1Len * 8
是為了要騰出str1
長度的字串空間,再來就是要把str2
補進去str1
所以補完的程式碼為:
修改成適用 big/little-endian
在 GCC builtin function 中,可以查到 Built-in Function:
int __builtin_clz (unsigned int x)
Returns the number of leading 0-bits in x, starting at the most significant bit position. If x is 0, the result is undefined.
int __builtin_clzll (unsigned long long)
Similar to __builtin_clz, except the argument type is unsigned long long.
1
,在一些場合下很有用,例如計算 0-1 稀疏矩陣 (sparse matrix)或 bit array 中非 0
元素個數、計算兩個字串的 Hamming distance。Intel 在 2008 年 11 月 Nehalem 架構的處理器 Core i7 引入 SSE4.2 指令集,其中就有 CRC32
和 POPCNT
指令,POPCNT
可處理 16-bit, 32-bit, 64-bit 整數。GCC 提供對應的 builtin function:
: x
總共有幾個 1
。使用示範:
以下是個存在實作缺陷的版本:
呼叫 popcnt_naive(-1)
時,會造成無窮迴圈,請指出錯誤所在,並且重寫為正確的版本。
因為(-1)=1111…1112(32 bits)且當在做算術右移時,會一直補 MSB 進來,所以用函式popcnt_naive(int n)
,只要參數 n 小於0,即會造成無窮迴圈。
所以改進的程式碼為:
5
,實作 branchless 的 popcnt
並附上對應的程式原理解說。