---
# System prepended metadata

title: 2020q3 Homework3 (quiz3)
tags: [sysprog2020, '2020', quiz3, week3]

---

# 2020q3 Homework3 (quiz3)
{%hackmd QnyEFBdERZebn4iQDXNPnA %}
###### tags: `sysprog2020` `2020`  `quiz3` `week3`
## 測驗題 1:

## 測驗題 2:
### 題目
```c=
bool isPowerOfFour(int num)
{
    return num > 0 && (num & (num - 1))==0 &&
           !!(__builtin_clz(num) OPQ);  
}
```
### 答案
DPQ的答案 = & 0x1
可以看到 isPowerOfFour() 的內部運作邏輯，包括三個判斷式做判斷。三者為真 isPowerOfFour() 才會 return true。
第1個，是用以判斷輸入的數值是否為正數。
第2個，若 x & (x-1) == 0 為真，則代表 x 為2的次方數。這個判斷式是用來判斷輸入的數值是否為2的次方。
第3個，!!(__builtin_clz(x) & 0x1)，總共可以分成三個部分來解釋。從括弧由內而外解釋，第一個是 __builtin_clz(x) ，用來 return x 在化成二進位的時候從最高位元向左數遇到第一個1之前的0的個數。 第二個，__builtin_clz(x) & 0x1 是用來判斷 x 是否奇數。若 return true ，則代表 __builtin_clz(x) 為奇數，因此跟 0x1 AND 的時候，會 return true 。最後是，!!(__builtin_clz(x) & 0x1)，若 x 是奇數，則會回傳 true ，其中最特別的是，!! 是用來將值轉為布林值。

可以透過[線上編譯器](https://www.onlinegdb.com/online_c_compiler)來進行驗證

原本的考題如上，不過這週我再回去看的時候，發現題目變了。變成以下：
```c=
bool isPowerOfFour(int num)
{
    return num > 0 && (num & (num - 1))==0 &&
           !(__builtin_ctz(num) OPQ);  
}
```
第4行從 !!(__builtin_clz(num) OPQ) 變成 !(__builtin_ctz(num) OPQ) 。就結論來說是一樣的，差異在 __builtin_clz() 是從前面開始數0的個數，而 __builtin_ctz() 是從後面開始數。因此才會從兩個!變成一個!。
## 測驗題 3:
## 測驗題 4:
## 測驗題 5:


