2022q1 Homework3 (quiz3)

contributed by < a12345645 >

測驗1

#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

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

#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

  1. 第二行 x = ((x & 0xCC) >> 2) | (0x33)
    對調後的分成兩個兩個一組在對調

10 | 10 | 01 | 10

10 | 10 | 10 | 01

  1. 最後再兩兩對調

1 | 0 | 1 | 0 | 1 | 0 | 0 | 1

0 | 1 | 0 | 1 | 0 | 1 | 1 | 0