2010-07-19 44 views
0

我最近被問了一個問題,"how do you multiply without using the multiplication operator, without any sort of looping statements or explicit addition",並意識到我不熟悉按位操作。學習按位運算的資源?

明顯有wikipedia,但我需要更多的解釋適合新手。這也是hack guide,但我還沒有掌握它的水平。

我不介意你是否指出一本書中的一章,因爲我可以通過Safari Books和其他資源訪問一個好的圖書館。

+0

哈! 'a * b = ln(exp(a)^ b)'。沒有乘法,循環或加法! =) – Jens 2010-07-19 15:35:58

+0

考慮到這個問題的主題,我將Jens的評論閱讀爲ln(exp(a)XOR b)並質疑這將如何工作。太糟糕了exp(a)是一個浮點值,其位操作未定義... :-P – Alderath 2010-07-19 15:47:41

回答

3

Knuth,第2卷 - 半數值算法

+0

TAOCP是一本傳奇的書。我喜歡閱讀那些討論任意精度整數主題的章節。不幸的是,我所知道的所有資源(包括TAOCP)都假定可以對原始類型進行算術運算。我想他應該找一本關於數字邏輯的教科書。 – AraK 2010-07-19 15:43:48

+0

@AraK,很好的建議。 – 2010-07-19 15:52:51

2

這樣做的癥結歸結爲一個「半加器」和「全加器」。一個半加器增加了兩位輸入來產生一個單位結果和一個單位進位。一個完整的加法器增加三位輸入(兩個正常輸入加上一個較低位的進位)以產生一個單位結果和一個單位進位。

在任何情況下,結果都基於添加的真值表。對於一個半加器,即:0 + 0 = 0,0 + 1 = 1,1 + 0 = 1,1 + 1 = 0 +進位。

因此,結果的「正常」部分是輸入的XOR。結果的「carry」部分是輸入的AND,一個完整的加法器幾乎是相同的,但是作爲臭名昭着的「閱讀者練習」而留下。

把它們放在一起,你使用半加器對於最低有效位,全加器對於其他位來說要添加N位輸入

一旦你可以進行加法運算,有幾種方法可以進行乘法:將NxM是將N加到自己M次,更快(但有點難理解)的方式是移位和相加,例如,Nx5 = Nx4 + Nx1,可以產生NxB,其中B = 2 N留下L位。