Java二進位制淺談
阿新 • • 發佈:2021-01-27
Java二進位制淺談
主題
左移右移
為什麼Java裡>>叫右移,<<叫左移,又是怎麼運算的
右移即向右移一位,在運算中就是右移幾位就除以2的幾次方,如int mc = 10>>1 即mc = 5
左移同理,即左移幾位就乘以2的幾次方。
為什麼叫左移右移呢?
因為在2進制中,除以2(右移)就等於左邊的數向右邊移動一位,即:1010(10) -> 0101(5) 如果這種情況,即:1111(15) 右移一位後會變成 0111(7),這樣就會將最後一個捨棄掉 左移同理可得
在Java裡常見的HashMap中的運用
這裡可以看到,HashMap中在計算hash時會將高16位異或低16位;這裡的方式是什麼呢? 首先把公式提取出來 (h = key.hashCode()) ^ (h >>> 16) 然後第一步先看右邊,h>>>16,因為int在java中是32位,即:右移將去掉低位的16個數, 這樣code本身和高16位進行異或。如果數全是0 則異或的數就是本身,如果全是1異或後就是交換。 如:10010 ^ 00000 -> 10010 (保持原位), 10010 ^ 11111 -> 01101(進行交換). 這樣高16位不變,低16位和高16位進行異或。這樣做是將高16位也加入運算而減少hash碰撞
這裡將開始的低16和高16異或後的值和hash長度-1進行’與‘運算,去計算hash的下標。這裡高明的就在
n-1(n為hash長度),如:n長度預設16,即10000 減1後 得01111,這樣'與'運算後 所得的值只能在0-15之間。
'與'運算如果高位全是0則0的部分可以直接剔除,不參與運算。