contributed by < Thegoatistasty
>
1
__builtin_clzl
改寫題目完整程式碼
所謂最接近且大於等於 2 的冪的值,可以想成在2進位數值系統上,將最左邊的 1 往左移,並將右邊的 bits 全部設為 0。如:
題目的方法是以數值最左邊的 1 為首,將右邊所有的 bits 設為 1,最後回傳該數值 + 1,簡化版過程如下:
builtin_clzl 改寫
2.在 Linux 核心原始程式碼找出類似的使用案例並解釋
–––––––––待辦––––––––––
3. 當上述 clz 內建函式已運用時,編譯器能否產生對應的 x86 指令?
有 bsrq
2
(1) mod()
參考資料:https://www.geeksforgeeks.org/modulo-1097-1000000007/
簡單來說,這邊是用來防止overflow的
(2) if (!(i & (i-1)))
如同註解寫的,這裡用來判斷連接時要用幾個 bit
__builtin_{clz,ctz,ffs}
改寫,並改進 mod 的運算modulo改善策略:在有需要的時候做modulo就好
參考資料:Built-in mod ('%') vs custom mod function: improve the performance of modulus operation
3
SWAR版和原本的差別是在它可以一次對比 8 bytes,最後再加上未滿 8 bytes的序列。
第 4 行做的事就是設定以 8 bytes 為單位的結尾,並在接下來的 for loop 計算 "後續位元組數量"。
字元數量則 = 全長 - "後續位元組數量",得出 AAAA = 3
又因為以 8 bytes 為單位,會有餘數問題,所以在 17 行再加上剩下 bytes 的位元數
所以 BBBB = 7, CCCC = 7, DDDD = 0
–––––待辦–––––
4
將符合 pattern 的整數轉為 2 進制後就可以很容易看出規律:符合 pattern 的整數存在一個位置,使得左邊的位元都為 1,右邊都為 0
而精簡版程式碼可以寫為
原理大概是這樣 (參考chun61205)
二補數後會將他們變成
再跟原本做 XOR
相當於是 clear 最右邊的那個 1
所以結果必小於原本的數字