运算符
运算符是一种特殊的符合,用以表示数据的运算,赋值和比较等。
算术运算符
赋值运算符
比较运算符(关系运算符)
逻辑运算符
位运算符
三元运算符
算术运算符
除法
class AriTest {
public static void main(String[] args){
int num1 = 12;
int num2 = 5;
int result1 = num1 / num2;
System.out.println(result1); //2
int result2 = num1 / num2 * num2;
System.out.println(result2); //10
double result3 = num1 / num2;
System.out.println(result3); //2.0,因为是两个整型相除,所以结果为整型
double result4 = num1 / (num2 + 0.0);
System.out.println(result4); //2.4,num2再括号内被转化为了double型
}
}
取模运算
结果的符号与被模数的符合一致
开发中,经常用来判断能否被除尽的情况
自增
class AriTest {
public static void main(String[] args){
int a1 = 10;
int b1 = ++a1;
System.out.println(a1); //11
System.out.println(b1); //11
int a2 = 10;
int b2 = a2++;
System.out.println(a2); //11
System.out.println(b2); //10
//注意点
short s1 = 10;
//s1 = s1 + 1; //编译失败,1为整型
s1++; //自增不会改变数据类型
int n = 10;
n += (n++) + (++n); //10 + 10,此时n等于11,20 + 12(++n 为11+1 = 12)
System.out.println(n); //32
}
}
练习:给出一个三位整数,打印出它的个位,十位,百位。
class AriTest {
public static void main(String[] args){
int num = 789;
int bai = num / 100;
int shi = num % 100 / 10; //或num / 10 % 10
int ge = num % 10;
System.out.println("百位为:" + bai );
System.out.println("十位为:" + shi );
System.out.println("个位为:" + ge );
}
}
赋值运算符
符合:=
当 “ = ”两侧数据类型不一致时,可以使用自动类型转换或强制类型转换原则进行处理。
支持连续赋值
扩展赋值运算符:+=,-=,*=,/=,%=(推荐使用)
class SetValueTest {
public static void main(String[] args){
short num = 12;
//num = num + 2; //编译失败,1为整型
num += 2; //不会改变数据类型
System.out.println(num); //14
int i = 1;
i *= 0.1; //不会改变数据类型,结果仍为整型
System.out.println(i); //0
}
}
比较运算符
比较运算符的结果都是boolean型。
逻辑运算符
&——逻辑与 |——逻辑或 !——逻辑非
&&——短路与 ||——短路或 ^——逻辑异或
异或:a和b相同时为false,不同时为true
class LogicTest {
public static void main(String[] args){
boolean b1 = false;
int num1 = 10;
if(b1 & (num1++ > 0)){ //逻辑与 不管结果为多少都会符号右边执行
System.out.println("true");
}else{
System.out.println("false"); //运算结果相同
}
System.out.println(num1); //11
boolean b2 = false;
int num2 = 10;
if(b2 && (num2++ > 0)){ //短路与 只有发现false就不在执行符号右边的运算
System.out.println("true");
}else{
System.out.println("false"); //运算结果相同
}
System.out.println(num2); //10
boolean b3 = true;
int num3 = 10;
if(b3 | (num3++ > 0)){ //逻辑或 不管结果为多少都会执行
System.out.println("true"); //运算结果相同
}else{
System.out.println("false");
}
System.out.println(num3); //11
boolean b4 = true;
int num4 = 10;
if(b4 || (num4++ > 0)){ //短路或 只有发现true就不在执行之后的代码
System.out.println("true"); //运算结果相同
}else{
System.out.println("false");
}
System.out.println(num4); //10
}
}
推荐优先使用短路与(或)
位运算符(了解)
位运算是直接对整数的二进制进行的运算
& | ^ 是逻辑运算符还是位运算符取决于操作的数据类型(值类型为位运算符,布尔型为逻辑运算符)
左移
在一定范围内左移几位就乘以2的几次幂,但若移动太多位,可能会变为负数
面试题
最高效的方式计算2 * 8?
2 << 3 或 8 << 1
右移
在一定范围内右移几位就除以2的几次幂
若为正数,右移后空缺位补0
若为负数,右移后空缺位补1
无符号右移:被移位二进制最高位无论是0还是1,空缺位都用0补
与、或、异或
将0视作false,1视作true
与:
每一位都进行类似逻辑与的运算
或:
每一位都进行类似逻辑或的运算
异或
每一位都进行类似逻辑异或的运算
取反
包括符号位在内,每一位都取反
练习
class Temp {
public static void main(String[] args){
//交换两个变量的值
int num1 = 10;
int num2 = 20;
System.out.println("num1 = " + num1 + ",num2 = " + num2);
//方式一:定义临时变量temp
//int temp = num1;
//num1 = num2;
//num2 = temp;
//System.out.println("num1 = " + num1 + ",num2 = " + num2);
//方式二:
//好处:不用定义临时变量
//弊端:①相加后可能超出存储范围 ②只能用于数值类型
//num1 = num1 + num2;
//num2 = num1 - num2;
//num1 = num1 - num2;
//System.out.println("num1 = " + num1 + ",num2 = " + num2);
//方式三:位运算符
//原理:若m ^ n = k,不难发现k ^ m = n, k ^ n = m
int k = num1 ^ num2;
num1 = k ^ num1;
num2 = k ^ num2;
System.out.println("num1 = " + num1 + ",num2 = " + num2);
}
}
三元运算符
格式:
(条件表达式)?表达式1:表达式2;
条件表达式的结果为boolean型
根据条件表达式的真假,决定执行表达式1,还是表达式2:
若条件表达式的结果为true,则执行表达式1;
若条件表达式的结果为false,则执行表达式2;
表达式1和表达式2为同种类型
三元运算符与if-else的联系与区别:
1)三元运算符可简化if-else语句
2)三元运算符要求必须返回一个结果
3)if后的代码块可以有多个语句
运算符的优先级
运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。
表中上一行运算符总优先于下一行
只有单目运算符,三元运算符,赋值运算符是从右向左运算的
求0-255的整数的16进制
class Num {
public static void main(String[] args){
int i1 = 60; //求该数的16进制
int i2 = i1 & 15; //求i1后四位二进制的值,并赋给i2
String j = (i2 > 9) ? (char)(i2 - 10 + 'A') + "" : i2 + "";
int temp = i1 >>> 4;
i2 = temp & 15; //求i1前四位二进制的值,并赋给i2
String k = (i2 > 9) ? (char)(i2 - 10 + 'A') + "" : i2 + "";
System.out.println(k + j);
}
}