2011-06-16 67 views
5

我正在將計算機系統課程作爲我的碩士課程的預備課程,並且遇到了一些令我着迷且難以看到實際應用的東西,那就是「僞造減法」,並且事實上並不需要減法指令。是在現實世界中曾經使用過的「僞減法」嗎?

喜歡的東西:

說明X - Y

可以寫爲:

X +(〜Y + 1)現在

,這一切都很好,但它似乎像這對於簡單的減法過於複雜,特別是當你可以簡單地放置「x-y」時。是否有必要做到這一點的情況,還是僅僅可以做而不做的事情。

+1

看起來像2的補數學數學。它通常以這樣的硬件實現。 – 2011-06-16 15:28:35

+1

我不確定,但我認爲它在某些二進制搜索實現中使用。 它消除了2^31的限制。你可以谷歌的「二進制搜索破解」,並找到該例子。它是一個頁面,有50種方式計算mid =(hi + low)/ 2 – Behrooz 2011-06-16 15:32:41

+2

@Behrooz:做'低+(高 - 低)/ 2'。 – 2011-06-16 15:36:42

回答

2

這個二進制補碼的實現是在硬件中完成的,所以你不需要像內置數據類型那樣實現它們。

如果您正在製作一個n位整數算術庫,那麼您需要模擬整數加法,減法,乘法和除法等操作,在這種情況下,可能會執行這種技術來添加n位長度的數字,但在我看來,使用進位標誌來實現這一點更好。

+0

感謝您對可能使用的時間的解釋。 – Jetti 2011-06-16 15:50:55

+0

實際上,我曾經在一個樣本n位有符號整數算術庫中實現了這個方法,這個算法庫很容易實現。 – phoxis 2011-06-16 15:54:08

+0

@phoxis - 有趣!你能告訴我該庫有什麼用途嗎? – Jetti 2011-06-16 15:59:18

0

我看不到這樣做的重點。它不再有效率。事實上,如果編譯器沒有優化它,它最終會生成更多的操作碼。

6

這通常是在硬件層面(即在ALU內部)完成的。

在軟件層面上,它通常是無用的,因爲它永遠比直接減法(除非你有一個真正奇怪的編譯器/平臺組合)效率更高。

+3

這不會是編寫代碼的原因。 – 2011-06-16 15:28:36

+0

編譯器推斷它是一條加法指令,但CPU將執行'x +(〜y + 1)'。這是如何在硬件中實現的。 – 2011-06-16 15:32:26

+0

@ahmet:是的,這基本上是我的答案已經說過的。 – 2011-06-16 15:35:34

2

應該是顯而易見的,那就是減法如何內部完成,所以我不知道你所說的「在現實世界中使用」的意思。這就是爲什麼二進制補碼被選中的原因,因爲減法只是溢出負向加法。

+0

我的意思是,對我來說代碼只是使用普通的「 - 」來編寫代碼會有什麼好處嗎? – Jetti 2011-06-16 15:50:36

+0

@Jetti,no。然而,你的問題*實際上*是'是'僞減法'在現實世界中曾經使用過嗎?',答案是肯定的。 – Blindy 2011-06-16 16:45:49

1

我沒有看到任何理由在你的C代碼中做到這一點。用軟件做它不會比使用減號運算符減去更快 - 並且更加不清楚。

但是,這是處理器執行減法的方式。我敢打賭,你已經看過這個代碼作爲硬件的一個例子,因爲它更容易看到如何將成爲一個邏輯電路。

所以......不,你不會用在現實世界中,這代碼,但這操作在您的處理器執行的很多倍。

0

這樣的東西在CPU擁有數十億晶體管之前更常見。一個特定的CPU可能不會實現一個特定的減法操作碼,所以一個編譯器(或彙編程序)的目標是必須知道這個技巧。

這些操作還可以幫助您瞭解CPU的內部實現。例如,CPU的分裂操作有時是通過取除數的倒數並乘以分紅來完成的;互惠是唯一正在進行的實際「分工」。

+0

這通常不是如何執行部門! – 2011-06-16 15:43:41

相關問題