contributed by <jkrvivian
>
vic85821
>閱讀 重新理解數值 裡頭關於 count leading zero (clz) 的描述,設計實驗,比較 32-bit 數值對以下實做的效能差異:
測試重新理解數值中clz的
從1開始跑到UNIT_MAX,直接和gcc提供的內建函式__builtin_clz()
比對結果,結果測試都正確
程式碼:
for (i = 1; i < UINT_MAX; ++i) {
assert(clz_iteration(i) == __builtin_clz(i));
assert(clz_binary_search(i) == __builtin_clz(i));
assert(clz_byte_shift(i) == __builtin_clz(i));
}
uint16_t lower = (x & (0xFFFF >> shift);
結果完全不對,參考 TempoJiJi 同學的方法才發現錯誤,好粗心>"<
uint8_t clz_recursive(uint32_t x, int shift)
{
if (!shift) return 0;
uint16_t upper = (x >> shift);
uint16_t lower = (x & (0xFFFF >> (16 - shift)));
return upper ? clz_recursive(upper,shift>>1) : shift + clz_recursive(lower,shift>>1);
}
測試結果如上,一樣沒有印出任何訊息,正確
system embedded
HW1-4