contributed by < ray90514 >
3/19/2023contributed by <ray90514> 測驗1 求 log2 相當於求最高位的 1 在第幾位,以 uint32_t 為例,如果某數 x 最高位的 1 在高16位,則該數會大於 0xFFFF ,最高位的 1 會在 16 + n 位,這個 n 用二分搜尋法對 x 以同樣的方法求得。因為是求 ceil 所以結果要 +1 ,對於特殊情況也就是 2 的冪則是一開始先減一處理。 這段程式碼照邏輯少了以下 r |= shift; shift = x > 0x1; r |= shift
6/27/2022contributed by < ray90514 > 測驗1 以 GENMASK(6, 4) 為例, 0b01111111 & 0b11110000 = 0b01110000 ,也就是我們需要兩個數,一個數是最高到 h + 1 為 0 其餘為 1 ,另一個是最低位到 l - 1 為 0 其餘為 1 。可以位移全為 1 的數也就是 (~0UL) 來產生。位移的量為一個右移 63 - h 一個左移 l 。 Linux 核心的 GENMASK 實作 若依照上述想法寫出的 GENMASK 如下,也就是 Linux 核心一開始的實作 (((~0UL) << (l)) & (~0UL >> (BITS_PER_LONG - 1 - (h))))
5/15/2022contributed by <ray90514> 測驗1 #include <stdint.h> uint32_t average(uint32_t a, uint32_t b) { return (a >> 1) + (b >> 1) + (EXP1); } (a >> 1) + (b >> 1) 可以看成 a / 2 + b / 2 ,但因為最低位會被捨去,所以若 a 和 b 最低位都為 1 ,相加會進位要補上 1。 EXP1 為 a & b & 1 。
4/15/2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up