contributed by < ray90514 >
3/19/2023contributed by <ray90514> 測驗一 依照程式碼,主循環如下 判斷該迴文數長度是否為偶數,如果是該數必不為質數,找出下一個長度為奇數的迴文數 判斷是否為 3 或 5 的倍數,判斷是否為質數 求出下一個迴文數 判斷 3 和 5 的倍數有比較直接的方法,判斷質數則要先產生一個質數表,然後看質數表中的質數能否被該數整除。質數表的產生使用 Sieve of Eratosthenes 搭配 bitset 產生出小於等於 $sqrt(n) 的質數$。因為偶數除了 2 一定不是質數,只要記錄奇數就好。 以 bitset 儲存的質數表第 n 位為 0 代表 2n + 1 是質數,使用時先將質數表取反搭配 __builtin_ctzll 即可快速找到質數表中的質數。
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