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