造輪子 補碼實現與若干分析

2021-07-10 10:45:01 字數 2891 閱讀 7282

這周計算機原理課收到樓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...