contributed by <kevin550029
>
line4: x=0時, 直接回傳clz=32
line5: 0x80000000 為 1000…0000, 當 x 的 MSB=1 和 0x80000000 做 & 之後,
會不等於 0 並跳出迴圈, 因此只要一直將 左移 X,
當迴圈跳出時代表他已經遇到了第一個為1的位元
x 傳入後, 會先取出其 upper bits 並放入 y, 再藉由迴圈來增減需要移動的 bits 數
最後用減法來計算 leading zero 的個數
用 bit mask 判斷第一個為1的位元會出現在哪,
找出位置後進行適當長度的左移, 並繼續判斷
line5: 當 x <= 0x0000FFFF 表示 x的前16位元皆為零,
則將 x 左移 16位元, 並繼續判斷
Byte-Shift 和 Binary Search 的原理相似,
Byte-Shift 是將 x 往右移之後, 再判斷是否為 0
Harley’s algorithm 是使用雜湊法來判斷 leading zero 的個數,
Table 代表的是 hash tablex 輸入後, 會先經過 line:25~29 的處理, 將第一個為1位元後的bits都設為 0
例如 0100 0000 0000 0000 0000 0000 0000 0000
變成 0111 1111 1111 1111 1111 1111 1111 1111經由這個例子可以知道, 這樣處理之後, 真正會進入雜湊函數運算的值只會有32種
最後經由查表, 便可以快速地得到 leading zero 的個數
De Bruijn sequence
共筆 tina0405
共筆 jack81306
wikipedia: clz
你所不知道的C語言:數值系統篇