# 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 實作的案例,應當解釋並探討應用場景。 ::: ---
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.