contributed by < jerry7961
>
這段程式碼的目的是計算開平方根。
__builtin_clz(x)
會計算 x
最高有效位元(最左邊的 1 )之前有幾個 0 ,再用 31 減掉 __builtin_clz(x)
即可得到 x
最高有效位元的位置。
for loop
檢查 i
是否大於等於 2 的 16 次方(65536),如果是說明 i
至少有 16 位(在二進位表示中),因此 result
增加 16 ,並將 i
右移 16 位(i >>= 16),相當於除以 2 的 16 次方。這個過程重覆進行,直到 i
小於 65536 。接下來的 for loop 按照順序判斷 i 是否大於 、、 。最後函式返回 result
,即 的整數部分。__builtin_clz(x)
,__builtin_clz(x)
會計算 x 的二進位表示中,最高位(左側)開始連續的零的數量,也就是 x
最高有效位元(最左邊的 1 )之前有幾個 0 ,再用 31 減掉 __builtin_clz(x)
即可得到 x 最高有效位元的位置。__builtin_clz
的輸入若是 0 則無定義,所以 DDDD 應為 v | 1
,這樣即使原始輸入 v
為 0,操作後的結果也會是 1 ,可以安全使用__builtin_clz
。