1.6 运算符
1.6.1算术运算符
示例1:
</pre><div><pre name="code" class="java">class OperatorDemo{
public static void main(String [] args){
int x = 3;
int y = 4;
System.out.println(x+y);
System.out.println(x-y);
System.out.println(x/y);
System.out.println(x%y);
}
}
分析:x/y得到的结果为0,说明两个整型数据相除得到的结果是整型,相当于取商。
结论:1、整数相除只能得到整数。如果想得到小数,必须把数据变化为浮点数类型
2、“/”获取的是除法操作的商,“%”获取的是除法操作的余数
示例2:
2、“/”获取的是除法操作的商,“%”获取的是除法操作的余数
示例2:
class OperatorDemo{
public static void main(String [] args){;
System.out.println(3%2);
System.out.println(3%-2);
System.out.println(-3%2);
}
}
运行结果:结论:正数对负数取余,结果为正。
负数对正数取余,结果为负。
示例3:
class OperatorDemo2{
public static void main(String [] args){
int x = 2;
int y = 2;
x++;
++y;
System.out.println(x);
System.out.println(y);
int a1 = 2;
int a2 = 2;
int b1 = a1++;
int b2 = ++a2;
System.out.println("b1的值为:"+b1+",a1的值为"+a1);
System.out.println("b2的值为:"+b2+",a2的值为"+a2);
}
}
运行结果:结论:1、单独使用:
放在操作数的前面和后面效果一样。(这种用法是我们比较常见的)
2、参与运算使用:
放在操作数的前面,先自增然后再参与运算。
放在操作数的后面,先参与运算,再自增。
补充知识点:符号“+”的用法
1、加法 2、正号 3、字符串连接符
class OperatorDemo3 {
public static void main(String[] args) {
//加法
System.out.println(3+4);
System.out.println('a');
System.out.println('a'+1);
//正号
System.out.println(+4);
//字符串连接符
System.out.println("hello"+'a'+1);
System.out.println('a'+1+"hello");
}
}
运行结果:由此可以看出字符串“+”其他类型数据都为一个组合后的字符串。
1.6.2赋值运算符
基本赋值运算符:=
扩展赋值运算符:+=, -=, *=, /=, %=
=:把=右边的数据赋值给左边。
+=:把+=左边和右边的值做加法,然后赋值给左边。
示例1:
class OperatorDemo{
public static void main (String [] args){
short s = 1;
s += 1;
System.out.println(s);
}
}
运行结果:思考: s = s + 1和s += 1一样么?
class OperatorDemo{
public static void main (String [] args){
short s = 1;
s = s + 1;
System.out.println(s);
}
}
运行结果:分析:s += 1不等价于s = s + 1,而是等价于s = (short)(s + 1),这样,编译器在编译s += 1才不会报错。
1.6.3 比较/关系运算符
注意:

1、比较运算符的结果都是boolean型,也就是要么是true,要么是false。
2、比较运算符“==”不能误写成“=” 。
class OperatorDemo{
public static void main (String [] args){
System.out.println(3!=3);
System.out.println(4>=3);
}
}
运行结果:
1.6.4 逻辑运算符
逻辑运算符用于连接两个boolean类型的表达式。
"&"符号的运算特点:
true & true = true;
true & false = false;
false & true = false;
false & false = false;
true & true = true;
true & false = false;
false & true = false;
false & false = false;
"&"符号运算规律:
运算的两边只要有一个是false,结果肯定是false。
只有两边都为true,结果才是true。
运算的两边只要有一个是false,结果肯定是false。
只有两边都为true,结果才是true。
示例1:
class OperatorDemo{
public static void main(String [] args){
System.out.println((3>4)&(3==2));
}
}
运行结果: "|"符号的运算特点:
true | true = true;
true | false = true;
false | true = true;
false | false = false;
true | true = true;
true | false = true;
false | true = true;
false | false = false;
"|"符号运算规律:
运算的两边只要有一个是true,结果肯定是true。
只有两边都为false,结果是false。
示例2:
class OperatorDemo{
public static void main(String [] args){
System.out.println((3>4)|(3==2));
}
}
运行结果:
"^"符号的运算特点:
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
"^"符号运算规律:
^符号的两边结果如果相同,结果是false。
两边的结果不同,结果是true。
true ^ false = true;
false ^ true = true;
false ^ false = false;
"^"符号运算规律:
^符号的两边结果如果相同,结果是false。
两边的结果不同,结果是true。
示例3:
class OperatorDemo{
public static void main(String [] args){
System.out.println((3>4)^(3==2));
}
}
运行结果: "!"符号运算规律:
!true = false
!false = true
!!true = true
!true = false
!false = true
!!true = true
示例4:
class OperatorDemo{
public static void main(String [] args){
System.out.println(!(3>4));
}
}
运行结果: 扩展知识点:
&&和&的区别,||和|的区别。
&&:和&运算的结果是一样的,但是运算过程有点小区别。
&:无论左边的运算结果是什么,右边都参与运算。
&&:当左边为false时,右边不参加运算,这样可以提升效率。
&:无论左边的运算结果是什么,右边都参与运算。
&&:当左边为false时,右边不参加运算,这样可以提升效率。
||:和|运算的结果是一样的,但是运算过程有点小区别。
|:无论左边的运算结果是什么,右边都参与运算。
||:当左边为true时,右边不参加运算,这样可以提升效率。
使用&&和||比使用&和|更高效一些。
1.6.5 位运算符
分析:因为是位运算,所以我们必须先把数据换算成二进制。
3的二进制:11
00000000 00000000 00000000 00000011
4的二进制:100
3的二进制:11
00000000 00000000 00000000 00000011
4的二进制:100
00000000
00000000 00000000 00000100
&位与运算:有0则0。
00000000 00000000 00000000 00000011
&00000000 00000000 00000000 00000100
-----------------------------------------------
00000000 00000000 00000000 00000000
结果是:0
|位或运算:有1则1。
00000000 00000000 00000000 00000011
|00000000 00000000 00000000 00000100
-------------------------------------------------
00000000 00000000 00000000 00000111
结果是:7
^位异或运算:相同则0,不同则1。
00000000 00000000 00000000 00000011
&00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111
结果是:7
~按位取反运算符:0变1,1变0
00000000 00000000 00000000 00000011
~11111111 11111111 11111111 11111100 (补码)
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
结果是:-4
00000000 00000000 00000000 00000111
结果是:7
^位异或运算:相同则0,不同则1。
00000000 00000000 00000000 00000011
&00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111
结果是:7
~按位取反运算符:0变1,1变0
00000000 00000000 00000000 00000011
~11111111 11111111 11111111 11111100 (补码)
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
结果是:-4
运行结果:
^的特点:一个数据对另一个数据位异或两次,该数本身不变。
class OperatorDemo2 {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a ^ b ^ b); //10
System.out.println(a ^ b ^ a); //20
}
}
运行结果: 面试题:请自己实现两个整数变量的交换
class OperatorTest {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a:"+a+",b:"+b);
//方式1:使用第三方变量(开发中用的)
int c = a;
a = b;
b = c;
System.out.println("a:"+a+",b:"+b);
System.out.println("------------");
int x = 10;
int y = 20;
//方式2:用位异或实现(面试用)
//左边:x,y,x
//右边:x ^ y
System.out.println("x:"+x+",y:"+y);
x = x ^ y;
y = x ^ y; //x ^ y ^ y = x
x = x ^ y; //x ^ y ^ x = y
System.out.println("x:"+x+",y:"+y);
}
}
运行结果:
左移运算
3
<< 3 = 24 相当于 3 * 2(3) = 24
00000000000000000000000000000011
(00)00000000000000000000000001100000
00000000000000000000000000000011
(00)00000000000000000000000001100000
代码:
class OperatorDemo3{
public static void main(String [] args){
System.out.println(3<<3);
}
}
运行结果:结论:
左移几位其实就是该数据乘以2的几次方。
<<:可以完成2的次幂运算。
同理:左移几位其实就是该数据乘以2的几次方。
>>和>>>的区别:
>>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1
>>>:无符号右移 无论最高位是0还是1,左边补齐0
>>>:无符号右移 无论最高位是0还是1,左边补齐0
练习:最有效率的方式算出2乘以8等于几?
class OperatorDemo3 {
public static void main(String[] args) {
System.out.println(2 << 3);
}
}
运行结果:
1.6.6 三元运算符
格式:
(条件表达式) ? 表达式1 : 表达式2;
如果条件为true,就把表达式1作为结果。
如果条件为false,就把表达式2作为结果。
(条件表达式) ? 表达式1 : 表达式2;
如果条件为true,就把表达式1作为结果。
如果条件为false,就把表达式2作为结果。
示例:
class OperatorDemo{
public static void main(String [] args){
int x = 100;
int y = 200;
int z = x > y? x : y;
System.out.println("z:"+z);
}
}
运行结果:
练习:获取3个整数中的最大值
class OperatorTest{
public static void main(String [] args){
int x = 1;
int y = 2;
int z = 3;
int temp = x > y? x : y;
int max = temp > z? temp: z;
System.out.println(z);
}
}
运行结果: