二元操作符不改变操作元的值,而是返回可以赋给其他变量的值。
计算机中的数值都是以二进制(补码)存在的,正数的补码是它本身,负数的补码是除符号位各位取反,末位加1
1、位运算操作符
Java语言支持整数类型数据的位运算,位运算操作符包括(以下都是二元操作符):
●“&”—与运算
运算规则:1&1->1,1&0->0,0&1->0,0&0->0
●“^”—异或运算
运算规则:1^1->0,1^0->1,0^1->1,0^0->0
●“|”—或运算
运算规则:1|1->1,1|0->1,0|1->1,0|0->0
●“~”—取反运算
运算规则:~1->0,~0->1
●“>>”—算术右移位运算
int a1=12>>1 12的二进制表示:00000000 00000000 00000000 00001100
舍弃二进制12的最后一位,在二进制数的开头增加一位符号位:000000000 00000000 00000000 0000110
int a2=-12>>2 -12的二进制原码表示:10000000 00000000 00000000 00001100
补码:11111111 11111111 11111111 11110100
舍弃二进制补码的后两位,开头增加2位符号位11
1111111111 11111111 11111111 111101
还原成原码(减1然后除符号位外各位取反):10000000 00000000 00000000 00000011 ->-3
●“>>>”—逻辑右移位运算
也称为不带符号右移位操作符,在移位的过程中,二进制数的开头增加的位都是0
●“<<”—左移位运算
左移位,末位加0
2、位操作符用法举例
把一个字节的高4位与低4位交换
package dallapp;
public class BitMover {
public static byte swap(byte b) {
// 获取低四位和高四位
int lowBits = b & 0xF;
int highBits = b & 0xF0;
// 低四位左移,高四位逻辑右移,然后再或
return (byte) ((lowBits << 4) | (highBits >>> 4));
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println(swap((byte) 10));
System.out.println(swap((byte) 1));
System.out.println(swap((byte) -1));
}
}
输出结果:
-96
16
-1
3、“&&”和“||”是短路操作符,“&”和“|”是非短路操作符,它们的区别是:对于短路操作符,如果能根据操作符左边的布尔表达式就能推算出整个表达式的布尔值,将不执行操作符右边的表达式;对于非短路操作符,始终会执行操作符两边的布尔表达式。
4、三元操作符“?:”
语法形式:布尔表达式?表达式1:表达式2
int score=61
String result=score>60?”及格”:”不及格”
等价于
String result=null;
if(score>=60)
result=”及格”;
else
resule=”不及格”;
4、操作符“==”与对象的equals()方法
●当操作符“==”两边都是引用类型变量时,这两个引用变量必须都引用同一个对象,结果才为true
package dallapp;
public class Isequals {
public static void main(String[] args) {
Integer int1 = new Integer(1);
Integer int2 = new Integer(1);
Integer int3 = int1;
int[] array1 = new int[1];
int[] array2 = new int[1];
int[] array3 = array1;
// TODO 自动生成的方法存根
System.out.println("int1==int2 is " + (int1 == int2));
System.out.println("int1==int3 is " + (int1 == int3));
System.out.println("array1==array2 is " + (array1 == array2));
System.out.println("array1==array3 is " + (array1 == array3));
}
}
输出结果:
int1==int2 is false
int1==int3 is true
array1==array2 is false
array1==array3 is true
●当“==”用于比较引用类型变量时,“==”两边的变量被显示声明的类型必须是同种类型或有继承关系,即位于继承树上的同一个继承分支上,否则编译报错。
5、对象的equals()方法
equals()方法是在Object类中定义的方法,它的声明格式:
public boolean equals(Object obj)
Object类的equals()方法比较规则为:当参数obj引用的对象与当前对象为同一对象时,返回true,否则返回false;
JDK中有一些类覆盖了Object的equals()方法,它们的比较规则为:如果两个对象的类型一致,并且内容一致,则返回true;这些类包括:java.io.File、java.until.Date、java.long.String、包装类(如java.lang.Integer和java.lang.Double)
6、instanceof 操作符
instanceof用于判断一个引用类型所引用的对象是否是一个实例。instanceof左边的操作元是一个引用类型,右边的操作元是一个类名或接口名。形式如下:
obj instanceof ClassName
或者:
obj instanceof InterfaceName
例如:
Dog dog=new Dog();
System.out.println(dog instanceof XXX);
一个类的实例包括类本身的实例,以及所有直接或间接子类的实例,因此当XXX为以下值时,instanceof 表达式的值为true:
●Dog类
●Dog类的直接或间接父类
●Dog类实现的接口,以及所有父类实现的接口