原文出处:Java基础之运算符 关注码农爱刷题,看更多技术文章!
其他文章:Java基础之数组
【基本内容】
运算符是编程语言中用于执行各种操作的符号或关键字。Java中运算符可以分为下图中八大类:
一、算术运算符
int a = 15;
int b = 20;
// 两数相加
int result = a + b;
System.out.println("a + b =" + result);
// result = 35;
// 两数相减
result = b - a;
System.out.println("b - a =" + result);
// result = 5;
// 两数相乘
int result = a * b;
System.out.println("a * b =" + result);
// result = 300;
// 两数相除
result = b / a;
System.out.println("b / a =" + result);
// result = 1; 只取整数部分
// 两数求余
result = b % a;
System.out.println("b % a =" + result);
// result = 5; 只取余数部分
//自增
System.out.println("a++ =" + a++); //15,先输出再自增
System.out.println("a =" + a); //16
System.out.println("++a =" + ++a); //17,先自增再输出
//自减
System.out.println("b-- =" + b--); //20,先输出再自减
System.out.println("b =" + b); //19
System.out.println("--b =" + --b); //18,先自减再输出
二、关系运算符
int a = 15;
int b = 20;
System.out.println("a > b =" + (a > b)); //false
System.out.println("a < b =" + (a < b)); //true
System.out.println("a >= b =" + (a >= b)); //false
System.out.println("a <= b =" + (a <= b)); //true
System.out.println("a != b =" + (a != b)); //true
System.out.println("a == b =" + (a == b)); //false
三、逻辑运算符
int a = 15;
int b = 20;
boolean result = (a > 0) && (b > 0);
System.out.println("(a > 0) && (b > 0) =" + result ); //true
result = (a > 0) || (b < 0);
System.out.println("(a > 0) || (b < 0) =" + result ); //true
result = (a < 0) || (b < 0);
System.out.println("(a < 0) || (b < 0) =" + result ); //false
result = (a > 0) || (b < 0);
result = !reuslt;
System.out.println("(a > 0) || (b < 0) =" + result ); //false
四、赋值运算符
int a = 15; //赋值15
a += 3; //相加并赋值,结果为18
a -= 3; //相减并赋值,结果为15
a *= 3; //相乘并赋值,结果为45
a /= 3; //相除并赋值,结果为15
a %= 3; //取模并赋值,结果为0
五、位运算符
// 按位与 &
int a = 4 & 5 ;
// 底层运算是 0100 & 0101 = 0100 = 4
// 按位或 |
int a = 4 | 5 ;
// 底层运算是 0100 | 0101 = 0101 = 5
// 异或运算 ^
int a = 4 ^ 5 ;
// 底层运算是 0100 | 0101 = 0001 = 1
// 按位非即取反运算 ^
int a = ~4 ;
// a = -5(此处涉及到补码反码符号位等知识暂不作深入讲解)
//位移操作只针对int类型有效,byte,short,char,long需先转换为int再进行
//左移n位相当于乘以2的n次方
int a = 20 << 2 ;
//结果 a = 80
//右移n位相当于除以2的n次方,除不尽向下取整
int a = 20 >> 2;
//结果 a = 5
int b = -20 >> 2;
// 结果 b = -5
// 无符号右移
int a = 20 >>> 2;
//结果 a = 5
int b = -20 >>> 2;
// 结果 b = 1073741819
六、三元运算符
Java中唯一的一个三元运算符是条件运算符,其格式如下:
表达式1?表达式2:表达式3
不多做解释,参看以下代码,自己体会:
int a = 10;
int b = 20;
int max = a > b ? a : b; // 结果max为20
七、类型实例检查运算符
instanceof: 检查对象是否是特定类的实例 ;参看下列代码
String name = "coder love brushing topic";
boolean isStr = name instanceof String; // isStr = true
isStr = name instanceof Integer; // isStr = false
八、类型转换运算符
用于将值从一种类型转为另一种类型,符号格式和代码如下:
(type): 强制类型转换
long a = 10;
int b = (int) a;
【注意事项】
1.位运算的深入:位运算是上述运算中最不好掌握的一种运算,因为它是对二进制的运算,而二进制不是我们工作生活经常使用的进制,不直观;此外二进制有一些运算规则需要大家了解,如下:
序号 | 规则说明 |
1 | 最高位为符号位,0表示正数,1表示负数 |
2 | 二进制运算都是以其补码的方式参与 |
3 | 正数的原码、反码和补码都一样,三码合一 |
4 | 负数反码是原码取反(符号位不变),反码+1则为补码 |
5 | 零的反码和补码都是零 |
因为正数和零的原码、反码和补码都一样,此处以负数-1为例展示原码、反码和补码的转换关系:
short aa = -1;
// short类型在Java中占2字节
// 原码:10000000 00000001 (最高为1表示负数)
// 反码: 11111111 11111110 (最高位符号位不变,其他各位取反)
// 补码:11111111 11111111 (反码 + 1)
// 逻辑与 &
计算 aa = -1 & 4
// 因为是用补码参与运算
// -1补码: 11111111 11111111
// 4补码: 00000000 00000100
// 逻辑与: 00000000 00000100 (结果为4,正数不用再转为原码)
// 逻辑或 |
计算 aa = -1 | 4
// 因为是用补码参与运算
// -1补码: 11111111 11111111
// 4补码: 00000000 00000100
// 逻辑与: 11111111 11111111 (结果为负数,需要转为原码)
//先转反码: 11111111 11111110 (补码-1得反码)
//再转原码: 10000000 00000001 (取反得原码,结果为-1)
// 异或运算 ^
计算 aa = -1 ^ 4
// 因为是用补码参与运算
// -1补码: 11111111 11111111
// 4补码: 00000000 00000100
// 异或运算: 11111111 11111011 (结果为负数,需要转为原码)
//先转反码: 11111111 11111010 (补码-1得反码)
//再转原码: 10000000 00000101 (取反得原码,结果为-5)
// 取反运算 ^
计算 aa = ~-1
// 因为是用补码参与运算
// -1补码: 11111111 11111111
// 取反运算: 00000000 00000000 (结果不为负数,需无转码,值为0)
// 左移 <<
计算 aa = -1 << 2
// 因为是用补码参与运算
// -1补码: 11111111 11111111
// 左移2位: 11111111 11111100 (低位补0,结果为负数,需转码)
//先转反码: 11111111 11111011 (补码-1得反码)
//再转原码: 10000000 00000100 (取反得原码,结果为-4)
// aa = -1 * 2^2 = -4
// 右移 >>
计算 aa = -1 >> 2
// 因为是用补码参与运算
// -1补码: 11111111 11111111
// 右移2位: 11111111 11111111 (高位补符号位1,结果为负数,需转码)
//先转反码: 11111111 11111110 (补码-1得反码)
//再转原码: 10000000 00000001 (取反得原码,结果为-1)
// aa = -1 / 2^2 = -0.25 向下取整= -1
// 无符号右移 >>>
计算 aa = -1 >>> 2
// 因为是用补码参与运算
// -1补码: 11111111 11111111
// 右移2位: 00111111 11111111 (高位补符号位0,结果为正数无需转码)
// aa = 1073741823
2.位运算的应用:位运算相比算术运算符更高效,它常被用于下列场景:
// 2*8怎么运算性能最好?
// 采用左移运算
int a = 2 << 3;
// 怎么高效交换两个整数变量的值
// 采用异或运算
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
//怎么判断奇偶数
// 用逻辑与
int num = 5;
System.out.println(num + "是" + ((num & 1) == 0?"偶数":"奇数"));
//原因:二进制除了最后一位都是都是偶数,所以判断最后一位是0或1就可以判断奇偶
原文出处:Java基础之运算符 关注码农爱刷题,看更多技术文章!
其他文章: Java基础之数组