1
參照 你所不知道的 C 語言: bitwise 操作 ,考慮 next_pow2
可針對給定無號 位元數值 ,找出最接近且大於等於 的冪的值,例如:
next_pow2(7)
= 8next_pow2(13)
= 16next_pow2(42)
= 640001
= , 0010
= , 0100
= , 1000
= ) 。x
中,從最高位元的 至最低位元中的每個位元皆設定為 (e.g. 00001101
-> 00001111
) 。00001111 + 1
= 00010000
= ) 。2
LeetCode 1680. Concatenation of Consecutive Binary Numbers 給定一整數 ,回傳將 到 的二進位表示法依序串接在一起所得到的二進位字串,其所代表的十進位數字 + 之值。
100
為 = 最小值, 111
為 = 最大值) 。len
之值。if(!(DDDD))
為判斷是否為 的冪之值 (位元長度 = i
的最小值) 。(i | (EEEE))
則為左移預留長度,並與上一個連續 Binary Number 進行 bitwise 串接。3
UTF-8 字元可由 , , , 個位元組構成。其中單一位元組的 UTF-8 由 ASCII 字元構成,其 MSB 必為 0
。
UTF-8 的多位元組字元是由一個首位元組和 , 或 個後續位元組 (continuation byte(s)) 所構成。後續位元組的最高 個位元會設定為 10
。
ASCII | 0xxx.xxxx |
---|---|
2 bytes | 110x.xxxx 10xx.xxxx |
3 bytes | 1110.xxxx 10xx.xxxx 10xx.xxxx |
4 bytes | 1111.0xxx 10xx.xxxx 10xx.xxxx 10xx.xxxx |
若輸入的字串是一個有效的 UTF-8 序列,則計算其中的後續位元組數量,並將此數字從總字串長度中減去,即可確定字元數量。
buf
,轉換其型態成 unsigned integer type (64-bit),並且佔用 個 byte 。buf[0], buf[1], .. , buf[7]
的 次處理,調整為 qword[0]
的 次處理。意即讀取 qword[0]
同為一次讀取 buf
中 index 0~7 的陣列元素。並且將 end
指向 qword[len >> 3]
的位址。for
迴圈中輸入的 t0
一共包含 個位元組,進行 not bit6 and bit7
操做,以 population count 指令來計算其中的後續位元組數量 (不是 UTF-8 字元數量)。(1 << 3) * (len / 8)
可得到 的倍數,再減去 count
來得到 UTF-8 字元數量。len
不為 的倍數,則以 count_utf8
來計算 buf
中的 UTF-8 字元個數。4
判定 位元無號整數是否符合特定樣式 (pattern)
1
是否皆連續相鄰。(n ^ x) < FFFF
的特性,exclusive or ^
的邏輯運算,可透過 (x ^ ~x)
將二進位數字的所有位元設定為 。x
作 's complement (~x + 1)
,之後再進行 exclusive or ^
運算,得到的結果皆比原數少一個最低位的 (e.g. 11110000
vs 11100000
) ,並且皆小於原數。x
作 's complement 之後,無法將最低位 後的位元皆清零 (e.g. ~(11110100) + 1 = 00001100
) 。進行 exclusive or ^
運算後,反而會大於原數 (連續相鄰的 1
皆被保留) 。