使用位運算替代模運算

昨天的分析HashMap原理的文章裏面提到,使用位運算替代取模運算效率高,但位運算只能在特定場景下才能替代%運算。code

正常狀況下:效率

a % b = a - (a / b)*b

但若是b的值爲2的n次方的時候(n爲天然數),這時候就能夠用位運算來替代模運算, 轉化以下:原理

a % b = a & (b-1)

2的n次方的二進制以下:二進制

`
 0001 2^0  1  
 0010 2^1  2
 0100 2^2  4
 1000 2^3  8

從上面能看到左移一位是放大2倍,右移一位是縮小2倍方法

分別減一後的二進制co

0000 2^0-1 0
0001 2^1-1 1
0011 2^2-1 3
0111 2^3-1 7

舉例位運算

咱們算下11%8的模,文章

11的二進制是:1011

代入上面的公式:

11 % 8 = 11 & (8-1)

7的二進制: 0111

兩者作&(與)運算 ,回憶下運算規則:

& 與。 全1爲1, 有0爲0。  任何數與0與都等於0。  
| 或。 有1爲1, 全0爲0。  任何數與0或都等於原值。
~ 非。 逐位取反
^ 異或。 相同爲0,相異爲1。 任何數與0異或都等於原值。

結果:

1011 & 0111 = 0011

轉化成10進制後=3

因此11%8=3

這種方法只是適合於求一個數除以二的N次冥才正確,求模的過程,就是2^n-1的中1的個數就是n的值,再與a作&運算,得出來的低位就是咱們指望的餘數。

相關文章
相關標籤/搜索