?
# 2025q1 Homework5 (assessment)
contributed by < `Ian-Yen` >
## 紀錄閱讀[〈因為自動飲料機而延畢的那一年〉](https://www.opasschang.com/docs/the-story-of-auto-beverage-machine-1)的啟發
閱讀這篇文章的時候感覺的到作者為了做這個自動飲料機付出了多少的心血,雖然同時也有一種感受是看到作者遇到問題就去找別人幫忙,問了廠長,問了爸爸朋友,問了許多許多人,然後直接去要設計稿,這件事情在我的第一個想法是很給人添麻煩,感覺問題也不是都自己解決的。
或許是台灣教育的影響,感覺我在潛意識中,覺的不會就去問人解法,還直接拿去使用是一件不好的事,講簡單一點就是抄襲。但看到後面回頭一看,其實仔細想想學習不就是要先學會抄,抄襲之後使用自己的想法將不同地方的抄襲整合出新東西,也算是一種創新了。
寫到這裡還是很佩服作者靠著一股衝勁就一路把他幹到有成果的產出,即便花了一整年的時間,期間充滿對成功的各種不確定性,即使如此還是咬著牙繼續做,我覺的這是值得學習的態度,沒人知道會不會成功,也沒人知道未來會不會後悔,但要有做,才會有機會,我覺的是這篇文章想要教我的,即便最後說他認為沒有很成功,還有很多可以改善的空間,我覺的那也只是投入的時間問題而已,在做事情上能有這種鍥而不捨的態度的人,我認為應該是不會有什麼問題能真正的擊垮他。
「在出問題之前,永遠不知道會發生什麼問題,但如果害怕問題,將會因此永遠踏不出進步的步伐。」
## 前六周課堂心得
從課程一開始,老師就以「誠實面對自己」作為引導,這句話不只是開場白,而是一整學期反覆驗證的核心精神。雖然我對系統底層的認識原本不多,但這門課讓我慢慢看見那些平常被忽略的角落,像是記憶體對齊、linked list 的底層意涵,甚至是補數編碼設計的背後思維。
從課堂上講解 C 語言的指標與 linked list 開始,我意識到過去自以為「會寫程式」的我,其實對底層記憶體、資料結構的運作方式一知半解。雖然講解速度不快,但老師會從很多現實問題出發,例如 Linux 核心原始碼的 bitwise 操作、資料對齊、補數編碼,讓我開始反思:這些看起來好像離我很遠的系統議題,其實都潛藏在我每天用的應用程式裡。
這門課讓我最深刻的是,學習不是「把知識背起來」而已,而是你能不能 問出問題,能不能 勇敢承認不會,能不能 逐步整理並建構自己的理解架構。而這過程不能假裝,更不能僥倖,因為一做題就現形。
一學期過去,我開始能接受自己能力上的不足,也願意正視這些不足背後的結構問題。也許我還無法立刻精通 Linux 核心,甚至還在跟 C 語言搏鬥,但我已經知道要用什麼態度來學習這些東西。這不只是修課的過程,更是成長的開始。
## 問題
### Q1: Using bitwise operations, implement branchless min and max.
```c
int my_min(int x, int y)
{
return y ^ ((x ^ y) & -(x < y));
}
```
my_min(5, 3)
步驟!
proof!
這題可以分成兩個case:
x > y 與 x < y
case: x >= y
((x ^ y) & -(x < y)) = 0 因為 (x < y) = 0
(0 ^ y) = y
case: x < y
((x ^ y) & -(x < y)) = x ^ y 因為 -(x < y)= 0xFFFFFFFF
(x ^ y) ^ y = x
以上兩個case得到結果是在所有情況下,比較小的那個都會被return
### Q2: following Q1, without comparators. No if-else, switch-case, nor ? operators. Allow (internal) function calls including recursive calls. No external functions.
```c
int my_max(int x, int y)
{
return x ^ ((x ^ y) & - ((y - x) >>31);
}
```
把 (x < y) 改成 ((y - x) >> 31)
因為這個值的符號位等同於(x < y) 的數字
### Q3: Without +, -, *, / or external functions, calculate avg of two integers.
```c
int add(x, y)
{
int carry;
while(y != 0)
{
carry = x & y;
x = x ^ y;
y = (carry << 1);
}
return x;
}
int avg(int x, int y)
{
add((x & y), ((x ^ y) >> 1));
}
```
```c
int avg(int x, int y)
{
int carry;
while(y != 0)
{
carry = x & y;
x = x ^ y;
y = (carry << 1);
}
return (x >> 1);
}
```
## respberry pi
上禮拜發現 `couresa` 的課程忘記退選,所以開始去做作業,然後收到 `mail` 說要去領課程教材。拿到了一個數莓派,出於好玩,就使用 `buildroot` 去編譯了一個可以放在樹莓派裡面的 `kernel` ,結果裝上去之後發現它沒有網路,所以就試著要讓他有網路,經過一些 `...` 與GPT的對話,發現它裡面少了一個叫 `wpa_supplicant` 的東西,好像也沒有模組的驅動,但我還沒作到那裡,我原本是用我的 `server` 然後把原始碼 `git clone` 進去,然後去做編譯,但是發現非常不方便,因為要放在 `arm` 架構下的檔案裡面,且pve有一些限制,所以就改用實體機,然後去做交叉編譯,再把編譯完的東西弄到樹莓派裡面,是這樣計畫的但還沒做完。