2011-09-02 53 views
6

只使用加法,減法和偏移,我怎樣才能乘以一個給定的整數整數?Bitshift乘以任何數字

例如,我想通過17.

我知道左移是2的倍數乘以右移由2的冪除乘以一個整數,但我不知道如何推廣這一點。


那麼負數呢?轉換爲二進制補碼並執行相同的程序?

編輯: OK,我得到了這一點,請不要介意你轉換成二進制補碼,然後你移根據由左到右,而不是從右向左數。)


現在棘手的部分出現了。我們只能使用3個操作員。

例如,60乘以我可以用這個做到:

(x << 5) + (x << 4) + (x << 3) + (x << 2) 

哪裏x是我乘以數量。但是,這是7個操作員 - 我怎麼能凝聚這個只使用3?

+0

一般乘法不能輪班3點的操作來完成,加/減...但是,既圖17和60可在3個操作來完成。 (提示:嘗試減去60)編輯:我沒有看到這已經回答。 – Mysticial

+0

他們提出了這個問題,所以在3個操作員中方便地工作哈哈。感謝所有的幫助。 – Adam

回答

2

據我所知,沒有簡單的方法可以使用3個運算符進行乘法運算。

與60相乘是可能的,因爲60 = 64 - 4:(x << 6) - (x << 2)

+0

我不認爲在一般的3個操作中它是可能的。 (除了當然的乘法指令) – Mysticial

3

17 = 16 + 1 =(2^4)+(2^0)。因此,將您的數字左移4位(乘以2^4 = 16),並將原始數字添加到它。

查看它的另一種方法是:17是10001的二進制(基2),因此您需要對乘法器中設置的每個位(即位4和0,如上)進行移位操作。

我不知道C,所以我不會因爲提供代碼而讓自己難堪。

+0

謝謝。如果它的負數乘以?我對它做2s補充,然後用這個數字來完成我的功能/轉換? – Adam

11

它被稱爲移位和添加。維基百科有一個很好的解釋:

http://en.wikipedia.org/wiki/Multiplication_algorithm#Shift_and_add

編輯: 爲了回答您的其他問題,是轉換成二進制補碼會工作。但是您需要簽署足夠長的時間才能保存整個產品。 (假設這就是你想要的)

編輯2: 如果兩個操作數都是負數,那麼從一開始就只有兩個操作數表示恭維,您不必擔心這一點。

+0

謝謝你非常有幫助。 – Adam

+0

用第二個問題的答案編輯。 – Mysticial

5

這裏的乘以3的例子:

unsigned int y = (x << 1) + (x << 0); 

(其中我假定xunsigned)。

希望你應該能夠概括這一點。

+0

是的,我可以和謝謝你。如果它的負數乘以?我對它做2s補充,然後用這個數字來使我的功能? – Adam