Try   HackMD

2019q3 第 1 週測驗題

目的: 檢驗學員對 bitwise operator


測驗 1

考慮以下 C 程式的 align4 巨集的作用是,針對 4-byte alignment,找到給定地址的 round up alignment address。

#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)

延伸題目: 在 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
#include <stdint.h>
#define INT_SIZE_OF(n) \
    ((sizeof(n) + sizeof(int) + X) & ~(sizeof(int) + Y))

作答區

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)

延伸題目: 解釋運作原理並在 GitHub 找出實際應用的程式碼


測驗 3

考慮以下 C 程式碼:

#include <stdbool.h>
bool func(unsigned int x) {
    return x && ((x & (~x + 1)) == x);       
}

可改寫為以下等價的程式碼:

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)

延伸題目: 舉出 abs 以外,透過 bitwise 操作將原有運算改為 const-time 實作的案例,應當解釋並探討應用場景。