取模運算 和按位與

2021-10-04 16:47:49 字數 722 閱讀 9226

最近在研究 redis 原始碼,發現一些平時不怎麼用的編碼習慣,感覺挺有趣,記錄下

function isodd1($num) 

function isodd2($num)

以上兩個方法都是用來判斷乙個數是否為奇數,但是用到的操作符不同,有什麼區別 ?

%:取模操作符是基於 十進位制(人類思維) 的一種取模方式,如:11 % 4 = 3,常用在各種操作中,可判斷奇偶,也可以用在雜湊中,如:11 % 8 = 3,落在第 3 個槽中,即 $arr[3-1] 中

&:按位與是基於 二進位制 的,如:11 & 1 = 00001011 & 00000001 = 1,常用在 雜湊 中,如計算出的 雜湊 值為 11,雜湊槽個數為 8,則 11 & (8-1) = 00001011 & 00000111 = 00000011 = 2,即 $arr[2] 中

雖然只是符號的差別,但是效能差距還是蠻大的,有 10 倍的差距(可能體現不明顯),但有如下好處:

1.積少成多,如果處處都追求這種高效的方式,整體**質量可能也會更高,放到 c 語言也是如此,像 redis 這種追求超高效能的軟體,一定會用位運算的

2.如果別人看到了你的**是這樣,一定會覺得有點高大上的,畢竟一般很少有人用

但也有壞處:

1.由於非人類語言,所以有可能用出錯誤

2.別人看你的**,有可能需要繞個彎才能懂

哈哈~

求模運算( )和按位與運算( )

最近看了看hashmap原始碼,覺得裡面的乙個按位與運算用的很優雅,記錄一下。jdk7中,hashmap是 陣列 鍊錶 的結構,為了讓hashmap裡的元素分布的更加均勻,就要在陣列中給每個元素乙個合適的位置,求模運算是乙個不錯的方法,但是,jdk7中使用了一種更加優雅的方法,原始碼中的方法如下 s...

位運算之 按位與( )操作 (快速取模演算法)

由於位運算直接對記憶體資料進行操作,不需要轉成十進位制,因此處理速度非常快。按位與 bitwise and 運算符號為 a b 的操作的結果 a b中對應位同時為1,則對應結果位也為1 例如 10010001101000101011001111000 111111100000000 10101100...

位運算之 按位與( )操作 (快速取模演算法)

由於位運算直接對記憶體資料進行操作,不需要轉成十進位制,因此處理速度非常快。按位與 bitwise and 運算符號為 a b 的操作的結果 a b中對應位同時為1,則對應結果位也為1 例如 10010001101000101011001111000 111111100000000 10101100...