# 2022q1 Homework3 (quiz3)
contributed by < `a12345645` >
## 測驗1
```c
#define GENMASK(h, l) \
(((~0UL) >> (LEFT)) & ((~0UL) >> (l) << (RIGHT)))
```
`LEFT` = `63 - h`
`RIGHT` = `l`
- `~0UL` 為所有位元皆為 `1`
- `(~0UL) >> (63 - h)` 為最低位元到第 `h` 位元皆為 `1`
- `(~0UL) >> (l) << (RIGHT))` 為第 `l` 到最高位元都為 `1`
- 最後在把兩個做 AND 運算得到 mask
## 測驗 2
```c
struct foo;
struct fd {
struct foo *foo;
unsigned int flags;
};
enum {
FOO_DEFAULT = 0,
FOO_ACTION,
FOO_UNLOCK,
} FOO_FLAGS;
static inline struct fd to_fd(unsigned long v)
{
return (struct fd){EXP1, v & 3};
}
```
要將 `v` 對 4 個位元組進行向下對齊
代表要清除 `v` 的最後兩個位元
所以是 `v & ~3`
`EXP1` = `v & ~3`
## 測驗 3
```c
#include <stdint.h>
uint8_t rev8(uint8_t x)
{
x = (x >> 4) | (x << 4);
x = ((x & 0xCC) >> 2) | (EXP2);
x = ((x & 0xAA) >> 1) | (EXP3);
return x;
}
```
`EXP2` = `0x33`
`EXP3` = `0x55`
舉例原本為 01101010
1. 第一行 `x = (x >> 4) | (x << 4)`
把前 4 個 bits 與後 4 個 bits對調
0110 | 1010
1010 | 0110
2. 第二行 `x = ((x & 0xCC) >> 2) | (0x33)`
對調後的分成兩個兩個一組在對調
10 | 10 | 01 | 10
10 | 10 | 10 | 01
3. 最後再兩兩對調
1 | 0 | 1 | 0 | 1 | 0 | 0 | 1
0 | 1 | 0 | 1 | 0 | 1 | 1 | 0