1. 算术运算符
1.四则运算
四则运算:+,-,* ,/
隐含强制类型转换的四则运算:+=,-=,*= ,/=
测试代码如下:
/**
* 编译失败
* short类型参与运算会先转换为int类型,最终结果也是int类型
* 将int类型的结果赋给short类型,会产生编译错误
*/
short a = 1;
a = a+1;
/**
* 隐含强制类型转换
* b+=1 <=> b=(short)(b+1)
*/
short b = 1;
b+=1;
System.out.println(b); //2
2. 取余运算
%、%=
测试代码如下:
int a = 10 % 3;
//10%3=1
System.out.println("10%3=" + a);
int b = 10;
b %= 3;
//10%3=1
System.out.println("10%3=" + b);
3. 自增/自减运算
++,–
测试代码如下:
/**
* 自增自减运算符
* 如果在变量前边(如:--a),先加/减后用,在运算中,当前变量值先加/减一,再进行运算
* 如果在变量后边(如:a++),先用后加减,在运算中,先进行运算,当前变量值再加/减一
*/
int a = 10;
int b = 10;
int c = 10;
a = b++; //此时a=10,b=11,c=10
c = --a; //此时a=9,b=11,c=9
b = ++a; //此时a=10,b=10,c=9
a = c--; //此时a=9,b=11,c=8
//最终结果为:a=9,b=10,c=8
System.out.println("最终结果为:a=" + a + ",b=" + b + ",c=" + c);
2. 位运算符
位运算:&、|、~、^
移位运算:<<、>>、>>>
位运算符左右两边是数据时,做位运算;
位运算符左右两边是布尔值(true/false)时,做逻辑运算
1. 两个数据做位运算
&(位与运算): 有0则0,无0即1
|(位或运算): 有1则1,无1即0
~(按位取反运算): 0变1,1变0
^(位异或运算): 相同则0,不同为1
测试代码如下:
(点击补充原反补码的知识)
/**
* 正数的原码、反码、补码相同
* 3的补码:00000000 00000000 00000000 00000011(int类型)
* 4的补码:00000000 00000000 00000000 00000100(int类型)
* 3 & 4原(反/补)码:00000000 00000000 00000000 00000000
* 结果为0
*/
int a = 3 & 4;
/**
* 正数的原码、反码、补码相同
* 3的补码:00000000 00000000 00000000 00000011(int类型)
* 4的补码:00000000 00000000 00000000 00000100(int类型)
* 3 | 4原(反/补)码:00000000 00000000 00000000 00000111
* 结果为7
*/
int b = 3 | 4;
/**
* 3的补码:00000000 00000000 00000000 00000011(int类型)
* ~3补码:11111111 11111111 11111111 11111100
* ~3反码:11111111 11111111 11111111 11111011(符号位不变,补码减1)
* ~3原码:10000000 00000000 00000000 00000100(符号位不变,其余位取反)
* 结果为-4
*/
int c = ~3;
/**
* 正数的原码、反码、补码相同
* 3的补码:00000000 00000000 00000000 00000011(int类型)
* 4的补码:00000000 00000000 00000000 00000100(int类型)
* 3 ^ 4原(反/补)码:00000000 00000000 00000000 00000111
* 结果为7
*/
int d = 3 ^ 4;
System.out.println(a); //0
System.out.println(b); //7
System.out.println(c); //-4
System.out.println(d); //7
2. 异或的特点
一个数据对另一个数据异或两次,该数本身不变
a ^b ^b = a
b ^a ^a = b
测试代码如下:
/**
* 实现两个整数变量数值的交换
*/
int a = 10;
int b = 20;
//方式一
int temp = a;
a = b;
b = temp;
System.out.println("a=" + a + ",b=" + b); //此时a=20,b=10
//方式二
a = (a + b) - (b = a);
System.out.println("a=" + a + ",b=" + b); //此时a=10,b=20
//方式三
a = a ^ b;
b = a ^ b; //此时b = a ^ b ^ b = a;
a = a ^ b; //此时a = a ^ b ^ a = b;
System.out.println("a=" + a + ",b=" + b); //此时a=20,b=10
//方式四
a = a + b;
b = a - b;
a = a - b;
System.out.println("a=" + a + ",b=" + b); //此时a=10,b=20
3. 两个数据做移位运算
<<(左移位运算): 左边最高位舍弃,右边补齐0(a<<b=a*2^b)
>>(右移位运算): 最高位为0,左边补齐0;最高位为1,左边补齐1(a>>b=a/2^b)
>>>(无符号右移位运算): 无论最高位是0还是1,左边补齐0
测试代码如下:
/**
* 3<<2 = 3*2^2 = 12
* 正数的原码、反码、补码相同
* 3的补码:00000000 00000000 00000000 00000011(int类型)
* 3<<2:(00)000000 0000000 00000000 00000011 00
* 结果为12
*/
int a = 3<<2;
/**
* -24>>2 = -24/2^2 = -6
* -24的原码:10000000 00000000 00000000 00011000(int类型)
* -24的反码:11111111 11111111 11111111 11100111(符号位不变,其余位按位取反)
* -24的补码:11111111 11111111 11111111 11101000(符号位不变,反码加1)
* -24>>2:11 11111111 11111111 11111111 111010(00)(补码)
* 11111111 11111111 11111111 11111001(反码)
* 10000000 00000000 00000000 00000110(原码)
* 结果为-6
*/
int b = -24>>2;
/**
* 3<<2 = 3*2^2 = 12
* -24的原码:10000000 00000000 00000000 00011000(int类型)
* -24的反码:11111111 11111111 11111111 11100111(符号位不变,其余位按位取反)
* -24的补码:11111111 11111111 11111111 11101000(符号位不变,反码加1)
* -24>>>2:00 11111111 11111111 11111111 111010(00)(原反补码相同)
* 无符号右移位运算后,结果为正数,原反补码相同
* 结果为1073741818
*/
int c = -24>>>2;
/**
* 24的补码:00000000 00000000 00000000 00011000(原反补码相同)
* 24>>>2:00 00000000 00000000 00000000 000110(00)(原反补码相同)
* 结果为6
*/
int d = 24>>>2;
System.out.println(a); //12
System.out.println(b); //-6
System.out.println(c); //1073741818
System.out.println(d); //6
3. 三目运算符
结果 = 条件表达式 ? 表达式1 : 表达式2;
如果条件表达式满足(结果为true),则结果取表达式1
如果条件表达式不满足(结果为false),则结果取表达式2
测试代码如下:
/**
* 使用三目运算符获取两个整数中的较大值:
* max = a > b ? a : b;
* 使用三目运算符获取三个整数中的最大值
*/
int a = 12;
int b = 24;
int c = 6;
int max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
//a、b、c中的最大值为:24
System.out.println("a、b、c中的最大值为:" + max);