1. 程式人生 > >JAVA基礎知識補漏 位運算

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

時間比較緊,有些錯誤 請指出 ,不勝感激。