# 2019q3 第 1 週測驗題 :::info 目的: 檢驗學員對 [bitwise operator](https://hackmd.io/s/By0MltO_m) ::: --- ### 測驗 `1` 考慮以下 C 程式的 `align4` 巨集的作用是,針對 4-byte alignment,找到給定地址的 round up alignment address。 ```cpp #include <stdio.h> #define align4(x) (((x) + K) & (-4)) int main(void) { int p = 0x1997; printf("align4(p) is %08x\n", align4(p)); return 0; } ``` 預期程式輸出 `align4(p) is 00001998` ==作答區== `K` = ? * `(a)` `(-3)` * `(b)` `(-2)` * `(c)` `(-1)` * `(d)` `(0)` * `(e)` `(1)` * `(f)` `(2)` * `(g)` `(3)` :::success 延伸題目: 在 Linux 核心原始程式碼找出類似的 alignment 巨集並解釋其作用 ::: --- ### 測驗 `2` 考慮以下 C 程式可取得以 `sizeof(int)` 為 alignment 基礎的整數空間,也就是說,當 `sizeof(int)` 為 `4` 的時候: * 給定 `char arr[13];`,`INT_SIZE_OF(arr)` 要得到 `16`; * 給定 `short int s;`,`INT_SIZE_OF(s)` 要得到 `4` ```cpp #include <stdint.h> #define INT_SIZE_OF(n) \ ((sizeof(n) + sizeof(int) + X) & ~(sizeof(int) + Y)) ``` * 參考資訊: [Memory access and alignment](https://lwn.net/Articles/260832/) ==作答區== `X` = ? * `(a)` `(-3)` * `(b)` `(-2)` * `(c)` `(-1)` * `(d)` `(0)` * `(e)` `(1)` * `(f)` `(2)` * `(g)` `(3)` `Y` = ? * `(a)` `(-3)` * `(b)` `(-2)` * `(c)` `(-1)` * `(d)` `(0)` * `(e)` `(1)` * `(f)` `(2)` * `(g)` `(3)` :::success 延伸題目: 解釋運作原理並在 GitHub 找出實際應用的程式碼 ::: --- ### 測驗 `3` 考慮以下 C 程式碼: ```cpp #include <stdbool.h> bool func(unsigned int x) { return x && ((x & (~x + 1)) == x); } ``` 可改寫為以下等價的程式碼: ```cpp bool func(unsigned int x) { unsigned int unknown = 0; while (x && unknown <= 1) { if ((x & Z) == 1) unknown++; x >>= 1; } return (unknown == 1); } ``` 請補完程式。 ==作答區== `Z` = ? * `(a)` `(-3)` * `(b)` `(-2)` * `(c)` `(-1)` * `(d)` `(0)` * `(e)` `(1)` * `(f)` `(2)` * `(g)` `(3)` :::success 延伸題目: 舉出 abs 以外,透過 bitwise 操作將原有運算改為 const-time 實作的案例,應當解釋並探討應用場景。 ::: ---