算术运算符
算术运算符是对数值型的变量进行运算的。
常用算术运算符

所以 +运算符在java中表示三中含义:正号、加、字符串连接。
++ / % 运算符
java
public class SuanshuYsf {
public static void main(String[] args){
//除法
System.out.println(10 / 4); //从数学来看是2.5,实际是2
double d1 = 10 / 4; // 10 / 4 = 2; d1 = 2.0;
System.out.println(d1); //2.0
System.out.println(10.0 / 4);
//取模(取余数) java中取模的本质是一个公式:
//如果被除数<除数,取余就仍然是被除数。 1%3=1 2%5=2 -2%5=-2
//如果被除数=除数,结果为0
//如果被除数>除数
//a % b = a - a / b x b
//如果 a 为小数时:a % b = a - (int)a / b x b
//如果 a b 为小数时:a % b = a - (int)(a / b) x b
System.out.println(10 % 3); // 1
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); // 1
System.out.println(-10 % -3); // -1
System.out.println(-10.5 % 3); // -1.5
System.out.println(-10.5 % -3); // -1.5
//++
//前++ 后++
//作为独立运算时使用 ++i 和 i++ 没有任何区别
int i = 1;
++i; //i = i + 1;
System.out.println(i); // 2
i ++; //i = i + 1;
System.out.println(i); // 3
//如果作为混合运算时:
//前++: j = ++i; 先自增,后执行动作
//后++: k = i++; 先执行动作(这里的赋值是先给临时变量,然后由临时变量付给变量),后自增。java的编译器在遇到i++和i--的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉。
//
int j = ++i;
System.out.println("j = "+ j + " i =" + i); //j = 4; i = 4;
int k = i++; //int tmp = i; i = i + 1; k = tmp;
System.out.println("k = "+ j + " i =" + i); //k = 4; i = 5;
}
}
关系运算符(比较运算符)
用于表示一个表达式结果的运算。关系运算符的结果是一个boolean 值。true或false
常用关系运算符
java
int a = 6;
int b = 7;
boolean flag = a > b;
逻辑运算符
用于表示多个表达式结果的运算符,结果为一个boolean值。
常用逻辑运算符
分为两组:
- 短路与
&&, 短路或||, 取反! - 逻辑与
&,逻辑或|, 逻辑异或^

运算规则:
逻辑异或:当a和b不同是,则结果为true,否则为false;
短路与和逻辑与的区别
&&短路与: 如果第一个条件为false, 后边的条件不在去判断,结果为flase。效率高
&逻辑与: 不管第一个条件是否为false, 都会去判断后边的条件,结果为flase。效率低
java
int a = 5;
int b = 8;
if(a < 2 && ++b > 6){
System.out.println("ok");
}
System.out.println("a = "+ a +" b=" + b); // b = 8;
if(a < 2 & ++b > 6){
System.out.println("ok");
}
System.out.println("a = "+ a +" b=" + b); //b = 9;
短路或和逻辑或
||短路或: 如果第一个条件为true, 后边的条件不在去判断,结果为true。效率高
|逻辑或: 不管第一个条件是否为true, 都会去判断后边的条件,结果为true。效率低
java
int a = 5;
int b = 8;
if(a > 2 || ++b > 6){
System.out.println("ok");
}
System.out.println("a = "+ a +" b=" + b); // b = 8;
if(a > 2 | ++b > 6){
System.out.println("ok");
}
System.out.println("a = "+ a +" b=" + b); //b = 9;
取反操作(略)
逻辑异或(略)
赋值运算符
基本赋值运算符 int a = 15;
复合赋值运算符 a += b;a -= b;a *= b;a /= b;a %= b;
复合复制运算符会进行类型转换
java
byte b = 2;
b += 3;//这里有个细节 b = (byte)(b + 3)
b++; //b = (byte)(b + 1)
三元运算符
结果 = 布尔表达式?表达式1(true):表达式2(false)
java
int a = 10;
int b = 99;
int result = a > b ? a++ : b++; //这里执行 b++时候,是先执行result = b; b = b + 1; 这里的b++并不是独立运算,是赋值运算。
**使用细节:**表达式1 和 表达式2 的类型要和赋值的变量类型一致或可以自动转换
三元运算符本质
java
int result = a > b ? a++ : b++;
//本质是一个if else 语句
if(a>b){
result = a++;
}else{
result = b++;
}
三元运算符可以嵌套使用
java
int result = (s > d ? c : e) > b ? a++ : b++;
运算符优先级

上表特点:
上边优先级大于下边
只有单目运算、赋值运算,从右向左。

位运算(一般密码学经常使用)
java 中有7个位运算分为两组(&、|、^、~、>>、<< 和 >>>),位运算是对二进制的操作。
&、|、^、~
-
按位与
&:n = 0 & 0; // 0 n = 0 & 1; // 0 n = 1 & 0; // 0 n = 1 & 1; // 1 -
按位或
|:n = 0 | 0; // 0 n = 0 | 1; // 1 n = 1 | 0; // 1 n = 1 | 1; // 1 -
按位异或
^:javan = 0 ^ 0; // 0 n = 0 ^ 1; // 1 n = 1 ^ 0; // 1 n = 1 ^ 1; // 0 -
按位取反
~: 0->1, 1->0。作用对象是一个二进制。
2 & 3 示例:

~-2 示例:

~2 示例:

>>、<< 和 >>>
- 算术右移
>>: 低位溢出,符号位不变,并用符号位补溢出的高位。 - 算术左移
<<: 符号位不变,低位补0。 >>>逻辑右移也叫无符号右移, 规则是:低位溢出,高位补0。它的特点是不管符号位,右移后高位总是补0- 特别说明:没有
<<<符号
java
int a = 1 >> 2; // ... 0000 0001 => ... 0000 0000 本质: 1 / 2 / 2 相当于向右边移动一位,1就除以2
int b = 1 << 2; // ... 0000 0001 => ... 0000 0100 本质: 1 * 2 * 2 相当于向左边移动一位,1就乘以2