1. 程式人生 > 其它 >Java二進位制淺談

Java二進位制淺談

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的部分可以直接剔除,不參與運算。