contributed by < eric88525
>
l
位元需要為 0,可判斷 shift left 應該為 l
次,先 shift right(~0UL) >> (l) << (l))
可以寫成 (~0UL) << (l)
,原因是 (~0UL) >> (l) << (l))
後,結果為最低位元到 l
為 0 其餘為 1,跟(~0UL) << (l))
的結果一樣的&~3
並轉形成struct 定義的型態__VA_ARGS__
用於將 macro 中的 ...
展開
在 for 迴圈中:
_foreach_i
, 因此要在每次迴圈結束都+1,也就是 ++_foreach_i
_foreach_i
上限為 sizeof((int[]){__VA_ARGS__}) / sizeof(int);
,求得整個 int 陣列的元素數量編譯時在預處理停止,可以看到 macro 會有以下展開,在宣告 _foreach_i
時很巧妙的透過 () 和 = 的特性,先讓 i 等於陣列的第 0 元素,接著把 0 指派給 _foreach_i
32 bit 為 0x0000 0000 ~ 0xFFFF FFFF , 0~31 bit
4-6
7-9
10-12
13-15
是做相同的事情,先檢查 v 所含位元,是否大於 v 可能有的最高位元數的一半,舉例:
v > 0xFFFF
可確定最高位元至少會大於 1<<4 bit,也就是 16 bit,用 ret 紀錄下來根據二元樹的規則,節點右側會大於當前節點,左邊則是小於。因此在 line:5
比較完數值後,要選擇往右或是往左走
EXP14 為讓 **r 在 d 節點右邊 subtree 中,往走找到最小值
假設 d 為15,15 右邊 subtree 的最小數值為18
MAX_ALIGNMENT 的二進位為 0x10000
,減一後 0x1111
,可以把不足16的部分強制進位
進位後需要保留 0x10000
以後的資訊,因此要 & ~(MAX_ALIGNMENT - 1u)
,讓0~3bit 為0,4bit 以上保留
line 3-4:
line 5: 檢查 signed 或是 unsigned,如果 unsigned 條件會為 true
line 6:
line 7-8: 這段可視為 (__x / __d) ± 0.5