您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java怎么用位運算實現乘法運算的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java怎么用位運算實現乘法運算文章都會有所收獲,下面我們一起來看看吧。
例如,26 * 15
,在進行乘法操作時,我們一般這樣算,先用5
乘以6
得到30
,把0
寫下把3
記在一邊,再用5
乘以2
得到10
再加上之前的3
寫在下面,得到130
;計算完5
再計算1
分別乘以6
和2
把得到的結果26
記在下面,然后把130
和26
相加(有錯位)得到390
。
看完了十進制的相乘,再來看下二進制的相乘,基本原理是一樣的,也是以十字相乘法為例,計算 5 * 7
。
5
的二進制為101
,7
的二進制為111
,來看下二進制的十字相乘法。
可以看到二進制為101
和二進制111
用傳統(tǒng)的方式來計算,得到的結果為100011
,而二進制100011
對應的十進制為35
。
所以說,在計算的過程中,十進制和二進制的計算方式是一樣的,當然這里就不進行舉例和證明了。
既然計算過程有了,那么怎么樣用代碼來實現呢?
我們再來看下上圖中二進制的計算過程:
先用二進制111
的最后一位1
乘上 101
得到 101
。
再用二進制111
的倒數第2位1
乘上 101
得到 101
。
再用二進制111
的倒數第3位1
乘上 101
得到 101
。
得到的三個101
進行二進制相加,得到 100011
。
注意,第2
步和第3
步得到的結果101
都往前挪了一位,相當于1010
和10100
,也就是最后相加的計算為:10100 + 1010 + 101 = 100011
。
再來看得到最終相加的計算10100 + 1010 + 101 = 100011
,也就是只要我們找到如何把數據轉換為幾位數的相加就可以了,因為之前已經實現了如何用位運算實現加法操作。
這三個數101
、1010
、10100
的數量剛好與二進制111
的個數相同,也就是二進制(上圖下面那個乘數111
)有幾位就會產生幾個數相加,如果是與11111
相乘就會產生5
個數相加。
再來看數據之前的關系:
第一次相乘結果:101 = 101 + 0
第二次相乘結果:1111 = 101 < 1 + 101 = 1010 + 101
第三次相乘結果:100011 = 101 < 2 + 1111 = 10100 + 1010 + 101
從這里我們可以看到,每計算一次,101
只需要向左移一次再加上上一次的計算結果就可以了。
那么,怎么知道要左移多少次呢?從這里例子中看,111
每次計算后,向右移動一次,101
也跟著向左移動一次,直到111
只剩最后一位,則停止計算就好了。
根據上面的思路,來實現一下代碼:
// 用位運算實現加法 public static int add(int a, int b) { int sum = 0; while (b != 0) { sum = a ^ b; b = (a & b) << 1; a = sum; } return sum; } // 用位運算實現減法 public static int multi(int a, int b) { int res = 0; while (b != 0) { if ((b & 1) != 0) { res = add(res, a); } a <<= 1; b >>>= 1; } return res; }
運行一下代碼,看下結果:
可以看到計算是正確的,而且還支持負數。
關于“Java怎么用位運算實現乘法運算”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Java怎么用位運算實現乘法運算”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。