contributed by < Risheng1128
>
1
延伸問題:
x = 0
的狀況,並仍是 branchless參考以下程式碼,目標是可計算出
這題的手法和 quiz3 的第 7
題相似,相同處在於上述程式碼的 line 5 ~ 14
,目的是為了找到 x
最高位元為 1
的位置,接著可以發現最多只有右移 30
次,因此可以合理推論 EXP1
為判斷最後一個 bit 位置的判斷式,因此 EXP1 = r | shift | x >> 1
至於不同的地方在於 line 4
的 x--
,可以分成以下兩種情況
x
為 2 的冪, x--
會讓整個位數少一位,最後在用 line 15
的加 1
補回正確解答x
不為 2 的冪, x--
不影響 x
位數的改變,最後 line 15
的加 1
會取 ceil()
2
延伸問題:
3
延伸問題:
4
延伸問題:
5
延伸問題:
ACCESS_ONCE()
and compiler bugs〉及〈你所不知道的 C 語言:編譯器和最佳化原理篇〉進行說明READ_ONCE
/ WRITE_ONCE
巨集的實作和其演化 (使用 git log
觀察)