# 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 實作的案例,應當解釋並探討應用場景。
:::
---