上篇我們瞭解了: 位運算使用位運算能夠提高運算效率;
本篇嘗試收集那些地方能夠用到位運算,體驗位運算的神奇之處。
獲取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的冪次方