位運算實際運用


上篇我們瞭解了: 位運算使用位運算能夠提高運算效率;
本篇嘗試收集那些地方能夠用到位運算,體驗位運算的神奇之處。

獲取int所能表示的最大整數

用-1 無符號右移1位

  -1 >>>1   結果:2147483647

交換兩個整數

基本原理: 1^0^0=1; 0^1^1=0;一個數異或兩次相同的數是它本身

   public static void main(String[] args) {
        swal(10,20);
    }
    public static void swal(int a,int b){
        System.out.printf("a=%d,b=%d",a,b);
        a = b^a^a;
        b = a^b^b;
        System.out.printf("\na=%d,b=%d",a,b);
    }

結果

a=10,b=20
a=20,b=20

判斷奇偶

使用**&** 按位與運算;一個整數&1,如果是1,則爲奇數;爲0則爲偶數

//  判斷是否是奇數
    public static boolean isOdd(int i){
        return (i & i) ==1;
    }

a * (2^n) 等價於 a < < n

hashmap尋址算法

p = tab[i = (n - 1) & hash]

hashmap通過計算key的hashcode,經過擾動後,得到的hash與(容量–1)做&運算。這樣得出的值一定是0,(n-1)之間的值;

a&b,其結果一定會小於ab間的最小值。

給一個數,一定返回2的冪次方

    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

這是hashmap中的tableSizeFor方法;這也是爲什麼hashmap容量爲什麼是2的冪次方

假如cap參數是13
圖解
在這裏插入圖片描述
15+1=16;所以容量一定是2的冪次方

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章