contributed by < kylekylehaha
>
linux2020
在解題之前,必須先瞭解各個變數的用意:
*_dest
: 寫入的目標起始位置_write
: 寫入的位移量*_src
: 讀取的目標起始位置_read
: 讀取的位移量_count
: 欲複製的 bits 個數KK1
read_lhs
為 data
須向左偏移的量,故我們用 bitwise 操作: _read & 7
來做到 _read % 8
的效果。當我們需要 mod 時,我們只需和 做 AND 運算即可。white_lhs
也是同樣道理,故本題答案為:
KK1
= 7
KK2
_count
為欲複製的 bits 個數,其中在 while 內每次最多 bitsize
做複製,故可以得知每當 while 結束時,欲複製的 bits 數會減少 bitsize
個。故本題答案為:
KK2
= bitsize
data
做調整。由上面 KK1
的解析可得知,read_lhs
為需向左移的位移量,故必須data <<= read_lhs
if (bitsize > read_rhs)
,代表我們要複製的位元在下一項,然而因為第一行的 data = *source++
,現在 *source
已為下一項,故直接將下一項資料向右移 read_rhs
後,與 data
做 OR 運算。bitsize
小於 8 時,須將多餘的部分,用 mask 做消除。data
為這次 while 內要複製的位元。寫入分為兩種 case:
white_lhs
> 0: 需要調整寫入的位置。white_lhs
== 0: 直接將 data
寫入 *dest
即可。我們先討論 case2
data
長度小於 8,則必須確保不能污染到原本的資料 original
,故必須修正 data
,使 data
保留原本的部分以及欲寫入的部分。bitsize
= 4,代表欲寫入的 data
只有前 4 個 bit 是正確的,而 original & write_mask[bitsize]
= original & 00001111b
,即保留後面四個原本的 bit,前面四個為欲修改的 bit。接著,我們討論 case1,其中又分為兩種情況:
mask
為用來保留原來資料的部分。
bitsize > write_rhs(代表欲寫入的資料跨過一個位元組。)
original & mask
: 用來保留原本的部分,避免被污染。data >> write_lhs
: 將 data
右移到正確的位置,來避免污染原本的資料。*dest
的資料。*dest++
,故此時 *dest
為下一項的值。write_mask[bitsize - write_rhs
為欲保留的部分data << write_rhs
: 將欲寫入的部分左移到正確位置。original
做 OR 運算,即為正確寫入的資料。bitsize <= write_rhs
mask
,如果不需更新則直接寫入 *dest
。mask
來保留正確的 original
部分。VV1
s
,大於 s
的最小 2 的次方。s
屬於 2 的次方,則 s
& s-1
會等於 0
,代表 s
為 2 的次方。s & (s-1) == 0
,故回傳 s
s
不屬於 2 的次方,則 s
& s-1
會等於 1,故回傳 1 << (64 - _builtin_clzl(s))
,其值為: 2^(64 - _builtin_clz(s))
s
vv1
= s & (s-1) == 0
VV2
size
為 vector 內的個數, capacity
為 vector 內的最大容量,故我們可以知道答案為:
vv2
= v.size -= 1
__VA_ARGS__
為 v(t, s, name, ...)
中, ...
的內容,也就是第四項以後的參數。這邊是我第一次看到,故查了一下資料21世紀C語言之17。__attribute__((cleanup(vec_free))) = {.buf = {__VA_ARGS__}};
__VA_ARGS__
的內容存入 buf。vec_free
來釋放記憶體。