這周計算機原理課收到樓sir的乙個作業:要自己實現一套整數編碼的數碼轉換與若干運算,並分析。
我拿到的是補碼,其他的隊友分別要實現一套原碼、移碼或者自行設計一套「帥碼」(666)。
程式語言:c聽說規定要用c語言造這個輪子,真是遺憾,要是c++還可以各種運算子過載可以很優雅。
那好吧,在編碼之前,先做個約束。
函式簽名
注釋word atom(char*)
從字串中以帶符號十進位制的格式讀入,轉換為補碼
char* mtoa(word)
將補碼轉換為帶符號十進位制的字串格式
word madd(word, word)
補碼加法
word msub(word, word)
補碼減法
word mmul(word, word)
補碼乘法
word mdiv(word, word)
補碼整除
以上函式原型均為樓sir一手定義,於是我就照著來咯。
atom函式與mtoa函式在數學上互逆的,即(m
toa∘
atom
)(x)
≡x,x
是數(a
tom∘
mtoa
)(x)
≡x,x
是碼然而在計算機中受到機器精度限制,並不能好好地做運算。
考慮到這點,我們可以給函式加上定義域與值域的限制。
特別地,對於32位補碼,定義:at
om:[
−231,
231)→
[0,2
32) m
toa:
[0,2
32)→[
−231,
231)
atom(x)
=碼轉數:
char* mtoa(word w)
以上是錯誤示範。儘管完美地完成了補碼的數碼轉換,但是這樣就違反了一開始的約束了,用了 c 標準庫中的輪子。數轉碼mtoa中給res開的空間是比較寬鬆的。32位整數的十進位制表示不會超過11位字元,加上字串結束符
\0
最多12位。
正如之前的錯誤示範的正確思路,掃瞄字串即可。
碼轉數word atom(char* str)
// if res != 0 and negative flag
// consider about the input "-0"
if(res && flag)
res = ~res + 1;
return res;
}
這個需要將碼逐位取出(或者一次取多位)然後轉化為字串即可。
char* mtoa(word w)
word startcur = cur;
while(w)
word endcur = cur - 1;
// let's reverse
while(startcur < endcur)
if(cur == 0)
res[cur++] = '0'; // if 0
res[cur] = '\0';
return res;
}
這個操作相對低效一些並沒有太大的關係,這個通常跟i/o相關,i/o瓶頸帶來的時間代價遠大於此函式。
word madd(word a, word b)
word msub(word a, word b)
……沒錯,就是這麼簡單,補碼就是這麼方便。
complement.c
compile mode : c99
數學真有趣。#include
#include
typedef
unsigned
int word;
word atom(char* str)
// if res != 0 and negative flag
// consider about the input "-0"
if(res && flag)
res = ~res + 1;
return res;
}char* mtoa(word w)
word startcur = cur;
while(w)
word endcur = cur - 1;
// let's reverse
while(startcur < endcur)
if(cur == 0)
res[cur++] = '0'; // if 0
res[cur] = '\0';
return res;
}word madd(word a, word b)
word msub(word a, word b)
int main()
}
快速傅利葉變換。 ↩
造輪子 Shell實現守護程序
雖然在程式猿的世界裡流行乙個諺語 不要重複造輪子 但是如果你開的就是一輛16寸輪轂的a級車,給你一副21寸的賓利輪轂你也是裝不上的。就算是運氣好找到了一副18寸的奧迪輪轂,可以正常的安裝並行駛,但是大輪轂所帶來的車速表不准,舒適度下降的問題又是不可避免的。所以適當的造造輪子也不失是一種節約後期維護成...
造輪子 python手動實現OTUS
最近研究閾值化演算法,otus算是目前應用比較廣泛的,自己想實現otus看和opencv對比,哪個用時短 最後經numba加速後還是失敗,opencv的otus演算法速度是自己手寫的轉換速度的5 10倍。果然現成的輪子是比較好用的 otus法又稱最大類間方差法或者大津法,基本思想就是計算前景類與背景...
造輪子 toast元件的實現 下
1.解決 toast 中傳入 html 的問題,通過假的 slot 來實現 plugins.js toast.slots.default message toast.vue 使用 created 2.在 toast 中加 html 是比較危險的乙個動作,所以要加乙個選項預設不開啟。toast.vue...