java有四种位运算符 &(与),~(非),|(或),^(异或)
首先需要明确的是位运算符是对于二进制而言的,两个数进行位运算会先将其转换为二进制,然后再进行操作
以两个数来举例8和11
8的二进制形式为1000
11的二进制为1011
8&11==1000,即比较二进制的每一位,两数对应的位都是1才为1
8|11==1011,对应都是0才为0,否则为1
~8=0111=7,位是0,则为1,位是1,则为0
8^11=0011=3,两数的位相同则是0,不同则是1
关于异或运算,有一个很经典的算法题:在一个数组中(int[] array),每一个数都出现了两次,唯有一个例外,求出这个例外的数。
比较好的方法就是使用异或运算,既然每个数出现了两次,则同一个数进行异或运算结果为0,而且运算满足交换律。遍历数组,相邻的两个数进行异或运算,最后的结果就是所求的数
public static int singleNumber(int[] A) {
int num = 0;
for(int i=0;i<A.length;i++){
num^=A[i];
}
return num;
}
同时,java也有位运算符
<<左移
>>右移
例如:
int num=10;
num<<1
=>num=20
num>>1
=>num=10;
左移:原数乘以2的左移位数次幂
右移:原数除以2的右移位数次幂