# 2019q1 Homework2 (fibdrv) contributed by < `njjack` > ## 第一周測驗 1 ## [第一周測驗 2](https://hackmd.io/M7xGTe4iTsSA17QKZ4SbvA?view) ``` #include <stdint.h> #define ALIGN_uint32(x, a) __ALIGN_MASK(x, ((uint32_t)(a)) - 1) #define __ALIGN_MASK(x, mask) (((x) + (mask)) & ~(mask)) ``` 由於 alignment 的都是以 2^N^ 為單位,所以 a 只有一位會是 1,且由 `__ALIGN_MASK` 得到的 mask 的形式會是0...011...1 (共32位元),即 a 中 1 所在位元右邊所有位元為 1,其餘為 0,這使得若 x 沒有對齊 align 位置,則 x 加上 mask 後會進位得到較大的地址,再經 bitwise 運算 `& ~(mask)` 得到 align 後的位址 而當 x 是 `0x1006`, a 是 `4`,`ALIGN(x, a)` 後只有可能是 `0x1004` 或 `0x1008` ,經上述討論可知答案會是大值 `0x1008`