昨天的分析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作&運算,得出來的低位就是咱們指望的餘數。