^運算
^
表示二進制按位異或運算脓规,對應位置不同則為1栽连,相同的為0
如:45^17含義如下
1 0 1 1 0 1
^ 0 1 0 0 0 1
————————————————
1 1 1 1 0 0
int num = 45 ^ 17 = 1 1 1 1 0 0 = 60
&運算
&
同位與運算,判斷最后一位是否為1,只有都為1時才為1秒紧,否則為0
如:37 & 1 或者 37& 51
100101 & 1 = 1
或
1 0 0 1 0 1
& 1 1 0 0 1 1
————————————————
1 0 0 0 0 1
37 & 1 = 1
37& 51 = 33
移位運算
<<
: 左移運算符绢陌,num << 1,相當于num乘以2,表示加0
>>
: 右移運算符,num >> 1,相當于num除以2,表示減位
??????注意
: 移位符號右側(cè)的整數(shù)表示的是2的冪
>>>
: 無符號右移,也叫邏輯位移熔恢,忽略符號位脐湾,空位都以0補齊
43210 位數(shù)
--------
1010 十進制:10 原始數(shù) number
10100 十進制:20 左移一位 number = number << 1;
101 十進制:10 右移一位 number = number >> 1;
補充一點:計算機指令種的右移位運算符有2種,左移就是補0沒花哨叙淌。但右移就有點事情了秤掌。
算術右移 ? 意思是你移動后補的是最高位的值。
舉例:一個byte數(shù)字99 的二進制是 0110 0011
你右移4位后 補的是0 ------0000 0110
但是再看這一個:byte數(shù)字-107二進制是1001 0101 這是1開頭的
你右移4位后補的確是最高位1 -------1111 1001邏輯右移 ? 補0就完事了
應用舉例:
漢明距離的計算
/**
* 計算兩個數(shù)的 漢明距離
* @param x
* @param y
* @return
*/
public int hammingDistance(int x, int y) {
//通過二進制按位異或"^"運算鹰霍,對應位置不同則為1闻鉴,相同的為0
int num = x^y;
int count=0;
while(num > 0){
//通過同位與運算,判斷最后一位是否為1衅谷,只有都為1時才為1椒拗,否則為0
if((num & 1) == 1){ count++;}
//右移運算
num = num >> 1;
}
return count;
}