最近看了看hashmap原始碼,覺得裡面的乙個按位與運算用的很優雅,記錄一下。
jdk7中,hashmap是「陣列+鍊錶」的結構,為了讓hashmap裡的元素分布的更加均勻,就要在陣列中給每個元素乙個合適的位置,求模運算是乙個不錯的方法,但是,jdk7中使用了一種更加優雅的方法,原始碼中的方法如下:
static int indexfor(int h, int length)
是的,就是效率更高的按位與運算。這裡有乙個前提,length是乙個2的冪次方整數,這樣,length-1的二進位制就是乙個形如「0000111...」的數,比如,如果length=4,length-1=3,其二進位制表示為「0011」,如果length=8,length-1=7,其二進位制表示為「0111」,以此類推。將h和length-1進行按位與運算的時候,由於高位都是0,只有低位的1才能決定最終的結果,就相當於對h進行相應數值(即length)的求模運算。 取模運算 和按位與
最近在研究 redis 原始碼,發現一些平時不怎麼用的編碼習慣,感覺挺有趣,記錄下 function isodd1 num function isodd2 num 以上兩個方法都是用來判斷乙個數是否為奇數,但是用到的操作符不同,有什麼區別 取模操作符是基於 十進位制 人類思維 的一種取模方式,如 1...
邏輯運算與按位運算
邏輯運算 一 和 的區別 單 時,左邊無論真假,右邊都進行運算 雙 時,左true,右邊參與運算 左false,那麼右邊不參與運算。二 和 的區別 單 時,左邊無論真假,右邊都進行運算 雙 時,左true時,右邊不參與運算。按位運算 一 按位與 運算規則 除了 1 1 1,其它都是 0 system...
按位與 的運算
是二進位制 與 運算,參加運算的兩個數的二進位制按位進行運算,運算的規律是 0 0 0 0 1 0 1 0 0 1 1 1 對於參加運算的數要換算為二進位制進行運算,例如7 2的結果是2,過程如下 7 2 0111 0010 0010 2即 按位與運算,兩個當且僅當都為1的時候結果才為1,即1 1 ...