JAVA基礎知識補漏 位運算
今天看HashMap原始碼的時候看著這麼一句return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 有點忘了,畢竟現在一直寫業務程式碼,很少遇到這種程式碼。 這裡複習一下位運算。 (這句的意思是 key為null 直接返回 0 不為null 先取hashcode 然後計算 ^ 右邊的值 h無符號右移16位。 然後 hashcode 和右移後的 數值 取 異或 操作。 )
一、進位制轉化
二進位制:在計算機中最終的都是二進位制。我們平常一般使用都是 10進位制或者16進位制。
1.十進位制轉二進位制
十進位制比較特殊 十進位制轉二進位制,用十進位制除以2 得餘數 再翻轉得到二進位制。演算法如下
public static String Convert2Bin(int todo){
String result = "";
while(todo > 0 ){
System.out.println(todo);
result = todo%2 +result;
todo = todo/2;
}
return result;
}
2.2的冥次進位制轉二進位制 比如 8 進位制轉2 進位制 16進位制轉二進位制。 演算法如下。比如十六進位制的18 轉化為二進位制時,1 轉化為4位二進位制,0001 8轉化4位 1000 所以轉化後二進位制 00011000
public static String Convert2Bin(String todo,int type){ char[] chars = todo.toCharArray(); type = (int) (Math.log(type)/Math.log(2.0)); String result = ""; String temp; int tempint; int index = chars.length-1; while(index>=0){ temp = Convert2Bin(Integer.parseInt(String.valueOf(chars[index]))); tempint =type - temp.length(); while (tempint>0){ temp= "0"+temp; tempint--; } index--; result =temp+result; } return result; }
二、進位制運算子 (以下規則 運算物件是二進位制)
1、異或^:運算規則 位數不夠高位補0 相同為0 不同 1
2、位與運算& 同為1則為1 否者為0
3、位或運算| 有1為1 同0 為0
4、位非運算 單位運算,每位取反。如下
比如:~37
在Java中,所有資料的表示方法都是以補碼的形式表示,如果沒有特殊說明,Java中的資料型別預設是int,int資料型別的長度是8位,一位是四個位元組,就是32位元組,32bit.
8轉為二進位制是100101.
補碼後為: 00000000 00000000 00000000 00100101
取反為: 11111111 11111111 11111111 11011010
因為高位是1,所以原碼為負數,負數的補碼是其絕對值的原碼取反,末尾再加1。
因此,我們可將這個二進位制數的補碼進行還原: 首先,末尾減1得反碼:11111111 11111111 11111111 11011001 其次,將各位取反得原碼:
00000000 00000000 00000000 00100110,此時二進位制轉原碼為38
所以~37 = -38.
5.帶符號右移>> 4 >>2 最終為 1
6.帶符號左移<< 1<< 2 最終為二進位制 100 轉化為十進位制 4
7.不帶符號右移>>> 1101010 >>> 4 為 110
時間比較緊,有些錯誤 請指出 ,不勝感激。