一、表达式
表达式由运算符和操作数组成
例如: 5
num1
num1+num2
sum=num1+num2
二、运算符分类
算数运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符、位运算符
三、算数运算符
四、赋值运算符
格式:变量=表达式
例如:int n=3;//将3赋值给变量n
注意:赋值运算符是从右往左运算!赋值运算符的左边不能是常量!
复合赋值运算符
五、关系运算符
比较运算符用于判断两个数据的大小,如大于
比较的结果是一个布尔值
六、逻辑运算符
短路运算符:&&和||,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值
七、条件运算符
Java中的条件运算符是三目运算符
语法:布尔表达式?表达式1:表达式2
八、位运算符
操作二进制位,&,|,<<、>>、>>>
九、运算符优先级
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () [] . | 从左到右 |
2 | ! +(正) -(负) ~ ++ -- | 从右向左 |
3 | * / % | 从左向右 |
4 | +(加) -(减) | 从左向右 |
5 | << >> >>> | 从左向右 |
6 | < <= > >= instanceof | 从左向右 |
7 | == != | 从左向右 |
8 | &(按位与) | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= | 从右向左 |
ps:&、|、^这三个运算符在操作数分别是数值类型和布尔类型的时候,表示的含义分别是按位与、按位或、按位异或和逻辑与、逻辑或、逻辑异或。上面的表格我其实没有标识出来是按位还是逻辑,如果有大佬知道优先级的话麻烦在下方评论!
十、位运算符的使用
共同特性:先将操作数转换成二进制,然后按照二进制位做运算,移位运算符如果超出二进制位的部分丢弃
10.1、<<左移运算符
含义:使指定值的所有位都左移规定的次数
语法格式:value << num
规则:
- 低位补0
- 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33-32=1位
- 当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
10.2、>>右移运算符
含义:使指定值的所有位都右移规定的次数
语法格式:value >> num
规则:
- 高位补符号位,即正数高位补0,负数高位补1
- 如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33-32=1位
- 当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
10.3、>>>无符号右移运算符
语法格式:value >>> num
规则:
- 忽视符号位,高位补0
- 当无符号右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
10.4、示例代码
package org.cc.javase;
/*** 位运算符示例* @author cc**/
public class BitOperator {private static int a = 60;//0011 1100private static int b = 13;//0000 1101private static int c = -116;public static void main(String[] args) {//Integer.toBinaryString方法:若高位有连续的0,则高位不显示
// yu(a,b);//两个正数做与运算
// yu(a,c);//正负数做与运算,结果一定是一个正数
// huo(a,b);//两个正数做或运算
// yh(a,b);//两个正数做异或运算
// qf(a);//正数做取反运算
// yy(b,2);//正数右移两位
// yy(c,2);//负数右移两位
// zy(b,2);//正数左移两位
// zy(c,2);//负数左移两位
// yy1(c,2);//负数无符号右移两位}/*** & 与运算* @param a* @param b*/private static void yu(int a,int b){System.out.println("操作数a:"+complement0(a));System.out.println("操作数b:"+complement0(b));System.out.println("操作结果"+complement0(a&b));System.out.println(a&b);}/*** | 或运算* @param a* @param b*/private static void huo(int a,int b){System.out.println("操作数a:"+complement0(a));System.out.println("操作数b:"+complement0(b));System.out.println("操作结果:"+complement0(a|b));System.out.println(a|b);}/*** ^ 异或运算* @param a* @param b*/private static void yh(int a,int b){System.out.println("操作数a:"+complement0(a));System.out.println("操作数b:"+complement0(b));System.out.println("操作结果:"+complement0(a^b));System.out.println(a^b);}/*** ~ 取反* @param a*/private static void qf(int a){System.out.println("操作数a:"+complement0(a));System.out.println("操作结果:"+complement0(~a));System.out.println(~a);}/*** >> 带符号右移* @param a*/private static void yy(int a,int bitNum){System.out.println("操作数a:"+complement0(a));System.out.println("操作结果:"+complement0(a>>bitNum));System.out.println(a>>bitNum);}/*** << 带符号左移* @param a*/private static void zy(int a,int bitNum){System.out.println("操作数a:"+complement0(a));System.out.println("操作结果:"+complement0(a<<bitNum));System.out.println(a<<bitNum);}/*** >>> 不带符号右移* @param a*/private static void yy1(int a,int bitNum){System.out.println("操作数a:"+complement0(a));System.out.println("操作结果:"+complement0(a>>>bitNum));System.out.println(a>>>bitNum);}/** 将高位的0也显示出来 */private static String complement0(int number){String binaryStr = Integer.toBinaryString(number);StringBuffer sb = new StringBuffer();if(binaryStr.length()<32){int count = 32-binaryStr.length();for(int i=0;i<count;i++) sb.append("0");}return sb.append(binaryStr).toString();}}