Java中的位运算包括 与、或、非、异或、移位。
Java中的上述运算都是把其他进制转为二进制来运算的。
与:代表按位与,都为1则结果为1,有一个为0则结果为0 ,相当于条件并且
或:按位或,只要有一个为1,则为1,都为0则为0 ,相当于条件或
非:按位取反
异或:相同为0,相反为1
移位:操作数按位左移或右移,其中左移n位相当于原数乘以2的n次幂,右移n位相当于原数除以2的n次幂
下面是具体运算:
public class Wei {
public static void main(String[] args) {
// 1、位与( & )
// 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
System.out.println(5 & 3);// 结果为1
System.out.println(4 & 1);// 结果为0
// 2、位或( | )
// 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
System.out.println(5 | 3);// 结果为7
// 3、位非( ~ )
// 操作数的第n位为1,那么结果的第n位为0,反之。
System.out.println(~5);// 结果为-6
// 4、位异或( ^ )
// 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
System.out.println(5 ^ 3);//结果为6
// 5、左移( << )
// 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0://
// 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
System.out.println(5 << 2);// 运行结果是20 ,相当于5乘以2的平方
// 6、右移( >> ) 高位补符号位
// 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
// 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(5 >> 2);// 运行结果是1, 相当于5除以2的平方
// 7、无符号右移( >>> ) 高位补0
// 例如 -5换算成二进制后为:0101 取反加1为1011
// 1111 1111 1111 1111 1111 1111 1111 1011
// 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
System.out.println(5 >> 3);// 结果是0
System.out.println(-5 >> 3);// 结果是-1
System.out.println(-5 >>> 3);// 结果是536870911
}
}
计算机可识别的为二进制数据,所以在代码中使用位运算会提高编程效率!
比如这个算法题:一个数组中只有一个数会只出现一次,其他所有数都出现两次,如何找出只出现一次的那个数
如果使用嵌套循环的话复杂度高,效率慢,但是用异或就可以,首先要明确异或运算a^b^a^b=(a^a)^(b^b);
public class Test {
public static Integer findOnlyNum1(int[] array){
int result = 0;
for(int i = 0 ;i<array.length;i++){
result^=array[i];
System.out.println(result);
}
return result;
}
public static void main(String[] args) {
int[] array = {1,2,1,3,3,2,4,5,5,6,4,6,9,7,7,8,8};
System.out.println("result="+findOnlyNum1(array));
}
}
在比如下面这个例子:
如何找出一个正整数二进制中1的个数
首先要明白任何正整数和1按位与,那么只是正整数二进制的最后一位和1相与,例如5&1 即为 0101&0001=0001 结果为1
public static int BitCount1(int n){
int c =0 ; // 计数器
for (c =0; n >0; n >>=1) // 循环移位
c += n &1 ; // 如果当前位是1,则计数器加1
return c ;
}
public static void main(String[] args) {
// 5的二进制为 0101, 结果为2
System.out.println("result="+BitCount1(5));
}