ontributed by < OWaitsInTime
>
假定 x = 0010000000000000 根據上述程式得下列結果
(用半形空格隔開方便閱讀)
可以發現到程式目標是將最高位 1
右側所有位元變更為 1
//8
可以變更 1
右側距離8位元的 bit 為1
,連續8個 1
則會實現向右複製8個 1
的效果
考慮此效果可以將程式修改為
__builtin_clzl
改寫__builtin_clzl
的功能是回傳高位元 0-bits 的數量
64 - __builtin_clzl
可以得到最高 1
的 bit 位置
if it is power of 2, we increase the bit length
要求對 n 進行判斷,若為 2 的冪次方則 len + 1
從二進位表示觀察,確實發現在 2 的冪次方時 len 會增加 1 , i & (i - 1)
可以用來判斷 i 是否為 2 的冪次方
i | (ans << len)
用來將 i
與 1 ~ (i-1)
做串接
為何是 ?
(a∗b)%c=((a%c)∗(b%c))%c
, 不會在 int64 中溢出__builtin_{clz,ctz,ffs}
改寫clz : Counting Leading Zero
ctz : Counting Trailing Zero
ffs : Find First Set
__builtin_ffsl(long)
會回傳最高位 1 的位置
for迴圈可以看出 pattern 為連續的 1 ,所給程式碼樣式可以明顯觀察到此結果(用半形空格隔開方便閱讀)
以 1111 1111 0000 0000
為例,先取其 2 的補數
接著進行XOR運算
在這種 pattern 下 (n ^ x)
一定會小於 x
假設不是此種 pattern ,(n ^ x)
就不會小於 x