^运算
^
表示二进制按位异或运算,对应位置不同则为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,表示减位
注意
: 移位符号右侧的整数表示的是2的幂
>>>
: 无符号右移,也叫逻辑位移,忽略符号位,空位都以0补齐
43210 位数
--------
1010 十进制:10 原始数 number
10100 十进制:20 左移一位 number = number << 1;
101 十进制:10 右移一位 number = number >> 1;
补充一点:计算机指令种的右移位运算符有2种,左移就是补0没花哨。但右移就有点事情了。
算术右移 意思是你移动后补的是最高位的值。
举例:一个byte数字99 的二进制是 0110 0011
你右移4位后 补的是0 ------0000 0110
但是再看这一个:byte数字-107二进制是1001 0101 这是1开头的
你右移4位后补的确是最高位1 -------1111 1001逻辑右移 补0就完事了
应用举例:
汉明距离的计算
/**
* 计算两个数的 汉明距离
* @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;
}