contributed by < YSRossi
>
1
x
最接近且大於等於 2 的冪的值,x
最高位的 1 的下一個高位位元即是答案。x
最高位的 1 ,將比這個位元低位的位元都設成 1 ,最後加一進位後,得到答案。x |= x >> 1
,代表最高位的 1 右側的 7 個位元都設成 1,後續分別右移 8 、 16 、 32 個位元,且每次都要與 x 做 OR
存到 x
當中,使 64 個位元都處理過,最後加一進位後,得到 x
最接近且大於等於 2 的冪的值。2
i
接在 ans
的最低位。ans
往左位移,將低位元清出足夠多的 0,與 i
做 OR
,完成合併。i
最高位的 1 的位置,藉由判斷是否為 2 的冪 if (!(i & i - 1))
,若是的話 i & i - 1 == 0
,將 len
累加,得到最高位的 1 的位置。3
count_utf8
的 for (size_t i = 0; i < len; i++)
得知, len
代表的是字串總長度,單位為 byte
。for (; qword != end; qword++)
得知,一次會處理一個 qword
的大小,而一個 qword
為 64 位元,所以第四行的 len >> 3
將 len
除以 8 個 bytes,計算總共要處理幾個完整的 8 bytes。not bit6 and bit7
的 bitmask
,找出 10xx.xxxx
形式的 byte,使該 byte 經過 bitmask
的處理後的輸出為 1000.0000
。搭配函式 __builtin_popcountll
計算 64 位元中有多少位元為 1 ,即可求得 continuation bytes
數。count = (len >> 3) << 3 - count
,作用是將 len
的最右側 3 個位元設為 0 ,得到整除部分的 byte 數,再減去 continuation bytes
數。count = (1 << 3) * (len / 8) - count
中的乘以 8 與除以 8 也有相似的移位效果,能將 len
的最右側 3 個位元設為 0 ,再減去 continuation bytes
數。len & 7
相當於取 8 的餘數,處理剩餘無法被整除的部分,使用函式 count_utf8
求出 continuation bytes
數,最後將其加上 count
得到最後結果。4
判定 16 位元無號整數 x
是否符合以下特定樣式 (pattern)
pattern
,可以發現所有符合要求的數字都是一個最高位為 1 的 16 位元無號整數,且最低位的1與最高位之間的位元皆為1。XOR
後,會有以下兩種功能 :
x
最低位的 1 變成 0。x
最低位的 1 與最高位之間為 0 的位元變成 1。符合題目要求的 pattern
,最低位的 1 與最高位之間皆為 1 ,只會將 x
最低位的 1 變成 0 ,因此 XOR
後的結果會小於 x
。
不符合題目要求的 pattern
最低位的 1 與最高位之間存在 0,不只會將 x
最低位的 1 變成 0 ,還會將 x
最低位的 1 與最高位之間為 0 的位元變成 1,因此 XOR
後的結果會大於 x
。
x | (1111 1100)2 | (1111 1010)2 |
---|---|---|
n = -x | (0000 0100)2 | (0000 0110)2 |
n ^ x | (1111 1000)2 | (1111 1100)2 |