三、移位运算符 移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。 运算符 | 含义 | 例子 | << | 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) | x<<3 | >> | "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. | x>>3 | >>> | "无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0. | x>>>3 |
以int类型的6297为例,代码如下: [java] view plaincopy
- System.out.println(Integer.toBinaryString(6297));
- System.out.println(Integer.toBinaryString(-6297));
- System.out.println(Integer.toBinaryString(6297>>5));
- System.out.println(Integer.toBinaryString(-6297>>5));
- System.out.println(Integer.toBinaryString(6297>>>5));
- System.out.println(Integer.toBinaryString(-6297>>>5));
- System.out.println(Integer.toBinaryString(6297<<5));
- System.out.println(Integer.toBinaryString(-6297<<5));
运行结果: 1100010011001
11111111111111111110011101100111
11000100
11111111111111111111111100111011
11000100
111111111111111111100111011
110001001100100000
11111111111111001110110011100000 注:x<<y 相当于 x*2y ;x>>y相当于x/2y
从计算速度上讲,移位运算要比算术运算快。
如果x是负数,那么x>>>3没有什么算术意义,只有逻辑意义。 四、关系运算符 Java具有完备的关系运算符,这些关系运算符同数学中的关系运算符是一致的。具体说明如下: 运算符 | 含义 | 例子 | < | 小于 | x<y | > | 大于 | x>y | <= | 小于等于 | x<=y | >= | 大于等于 | x>=y | == | 等于 | x==y | != | 不等于 | x!=y |
instanceof操作符用于判断一个引用类型所引用的对象是否是一个类的实例。操作符左边的操作元是一个引用类型,右边的操作元是一个类名或者接口,形式如下: obj instanceof ClassName 或者 obj instanceof InterfaceName 关系运算符产生的结果都是布尔型的值,一般情况下,在逻辑与控制中会经常使用关系运算符,用于选择控制的分支,实现逻辑要求。 需要注意的是:关系运算符中的"=="和"!="既可以操作基本数据类型,也可以操作引用数据类型。操作引用数据类型时,比较的是引用的内存地址。所以在比较非基本数据类型时,应该使用equals方法。 五、逻辑运算符 逻辑非关系值表A !A
true false
true
逻辑与关系值表A B A&&B
false false false
true false false
false true false
true true true
逻辑或关系值表A B A||B
false false false
true false true
false true true
true true true
在运用逻辑运算符进行相关的操作,就不得不说“短路”现象。代码如下: if(1==1 && 1==2 && 1==3){ } 代码从左至右执行,执行第一个逻辑表达式后:true && 1==2 && 1==3
执行第二个逻辑表达式后:true && false && 1==3
因为其中有一个表达式的值是false,可以判定整个表达式的值是false,就没有必要执行第三个表达式了,所以java虚拟机不执行1==3代码,就好像被短路掉了。 逻辑或也存在“短路”现象,当执行到有一个表达式的值为true时,整个表达式的值就为true,后面的代码就不执行了。
“短路”现象在多重判断和逻辑处理中非常有用。我们经常这样使用: [java] view plaincopy
- public void a(String str){
- if(str!=null && str.trim().length()>0){
- }
- }
如果str为null,那么执行str.trim().length()就会报错,短路现象保证了我们的代码能够正确执行。
在书写布尔表达式时,首先处理主要条件,如果主要条件已经不满足,其他条件也就失去了处理的意义。也提高了代码的执行效率。 位运算是对整数的二进制位进行相关操作,详细运算如下: 非位运算值表A ~A
1 0
1
与位运算值表A B A&B
1 1 1
1 0 0
0 1 0
0 0 0
或位运算值表A B A | B
1 1 1
1 0 1
0 1 1
0 0 0
异或位运算值表A B A&B
1 1 0
1 0 1
0 1 1
0 0 0
示例如下: [java] view plaincopy
- int a=15;
- int b=2;
- System.out.println(a+"&"+b+"="+(a&b));
- System.out.println(a+"|"+b+"="+(a|b));
- System.out.println(a+"^"+b+"="+(a^b));
运算结果如下: 15&2=2
15|2=15
15^2=13 程序分析:
a | 1 | 1 | 1 | 1 | 15 | b | 0 | 0 | 1 | 0 | 2 | a&b | 0 | 0 | 1 | 0 | 2 | a|b | 1 | 1 | 1 | 1 | 15 | a^b | 1 | 1 | 0 | 1 | 13 |
按位运算属于计算机低级的运算,现在我们也不频繁的进行这样的低级运算了。
|