运算符
位运算符
| << | 左移 | 空位补0,被移除的高位丢弃,空缺位补0。 |
|---|---|---|
| >> | 有符号右移 | 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,空缺位补1。 |
| >>> | 无符号右移 | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 |
|---|---|---|
| & | 与运算, 只要有0结果就是0 | 二进制位进行&运算,只有1&1时结果是1,否则是0; |
|---|---|---|
| | | 或运算, 只要有1结果就是1 | 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; |
| ^ | 异或运算, 只要不一样就是1 | 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1 |
| ~ | 取反, 正数变负数, 负数变正数 | 所有二进制位取反, 0变1, 1变0 |
class BitOperatorTest2 {
public static void main(String[] args) {
int n1 = 0xA5; // 0000 0000 0000 0000 0000 0000 1010 0101
int n2 = 0x3E; // 0000 0000 0000 0000 0000 0000 0011 1110
// 0000 0000 0000 0000 0000 0000 1010 0101 &
// 0000 0000 0000 0000 0000 0000 0011 1110 =
// 0000 0000 0000 0000 0000 0000 0010 0100 => 0x24 => 36
System.out.println(n1 & n2); // 与, 只要有0就是0
// 0000 0000 0000 0000 0000 0000 1010 0101 |
// 0000 0000 0000 0000 0000 0000 0011 1110 =
// 0000 0000 0000 0000 0000 0000 1011 1111 => 0xBF => 11*16+15 => 191
System.out.println(n1 | n2); // 或, 只要有1就是1
// 0000 0000 0000 0000 0000 0000 1010 0101 ^
// 0000 0000 0000 0000 0000 0000 0011 1110 =
// 0000 0000 0000 0000 0000 0000 1001 1011 => 0x9B => 16*9+11 => 155
System.out.println(n1 ^ n2); // 异或, 只要不一样就是1
// 0000 0000 0000 0000 0000 0000 1010 0101
// 1111 1111 1111 1111 1111 1111 0101 1010 => 这是负数, 负几?
// -1 => 1111 1111 1111 1111 1111 1111 0101 1001
//取反 => 0000 0000 0000 0000 0000 0000 1010 0110 => 0xA6 => 16*10 + 6 = 166
// 所以它是-166
System.out.println(~n1); // 正数变负数, 负数变正数.
System.out.println(n1 ^ -1);
}
}
public class BitOperatorTest {
public static void main(String[] args) {
// <<, >>, >>>
int n = 0x7C; // 0000 0000 0000 0000 0000 0000 0111 1100
System.out.println(n << 3); // 0000 0000 0000 0000 0000 0011 1110 0000 => 0x3E0 => 3*16#2+14*16 -> 992
System.out.println(n >> 5); // 0000 0000 0000 0000 0000 0000 0000 0011 // 有符号右移
System.out.println(n >>> 2);// 0000 0000 0000 0000 0000 0000 0001 1111 => 0x1F => 31
}
}
算数运算符
| 运算符 | 运算 | 范例 | 结果 |
|---|---|---|---|
| + | 正号 | +3 | 3 |
| - | 负号 | b=4; -b | -4 |
| + | 加 | 5+5 | 10 |
| - | 减 | 6-4 | 2 |
| * | 乘 | 3*4 | 12 |
| / | 除 | 5/3 | 1 |
| % | 取模 | 7%5 | 2 |
| ++ ++ | 自增(前):先运算后取值 自增(后):先取值后运算 | a=2;b=++a; a=2;b=a++; | a=3;b=3 a=3;b=2 |
| - - - - | 自减(前):先运算后取值 自减(后):先取值后运算 | a=2;b=- -a a=2;b=a- - | a=1;b=1 a=1;b=2 |
| + | 字符串相加 | “He”+”llo” | “Hello” |
*(乘):int x=3510;
x = x/1000*1000;
x的结果是?3000, 小心, 丢失了一些数据
%(取模):如果对负数取模,可以把模数负号忽略不记,如:5%-2 == 1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数
如果-5 % 2 == -1
实际应用 :
1) m % n 结果可以让它落在一个已知的n的范围内
2) m % n 如果结果为0, 说明m可以被n整除, 结果不为0, 则说明m不能被n整除
-
m % 2 如果结果为0, 说明m是偶数, 如果结果非0, 说明是m是奇数
++ (自增前):
++ (自增后):
5++; 这是错误的, 只有变量支持++和--
后++, a++; 先用后加
int a = 20;
int b = a++; // b:20, a : 21
前++, ++a; 先加后用
int a = 20;
int b = ++a; // b:21, a:21
扩展赋值运算符
赋值表达式
赋值表达式的值是最右面的值
java支持连续赋值, 例如 :
int a, b, c;
a = b = c = 100;
a = b = 100;
a = 100;
从右向左, 把100数据刷入到c变量空间中. 再使用表达式本身的值100 再刷入b变量空间中, 再使用表达式本身的值100刷入a变量空间
更好的写法 :
int a = 100;
int b = 100;
int c = 100;
累操作
累操作 : 不会引起数据类型的变化
扩展赋值运算符: +=, -=, *=, /=, %= 例如 : int n = 10; n += 30; 效果相当于 n = n + 30, 但是不会引起数据类型的变化
short n = 10;
n += 20; // 没有问题的
n = n + 20; // 右面是int型, 左面short接不住
比较运算符
应用于2个数据的比较, 结果一定是boolean类型的值, 要么true, 要么false
| < | 小于 4<3 false |
|---|---|
| > | 大于 4>3 true |
| <= | 小于等于 4<=3 false |
| >= | 大于等于 4>=3 true |
比大小操作, 只适用于基本数据类型中的数值型之间
| == | 相等于 4==3 false |
|---|---|
| != | 不等于 4!=3 true |
相等和不等操作, 适用于所有数据类型
比较运算符“==”不能误写成“=”
在Java中不可以写成3<x<6,因为 3 < x的结果是一个boolean, 而boolean不能比较大小, 应该写成x>3 && x<6 。
3 < x != false 这样写是可以的
逻辑运算符
只能适用于boolean类型, 结果也一定是boolean
| a | b | a&b | a|b | !a | a^b | a&&b | a||b |
|---|---|---|---|---|---|---|---|
| true | true | true | true | false | false | true | true |
| true | false | false | true | false | true | false | true |
| false | true | false | true | true | true | false | true |
| false | false | false | false | true | false | false | false |
&和 && 都是并且的逻辑 , 只要有false, 结果一定是false
a && b 时, 如果a为false, 结果一定也是false, 所以短路b操作.
| 和 || 都是或者的逻辑, 只要有true, 结果一定是true
三元运算符
格式:变量 = (布尔表达式) ? 表达式1 : 表达式2;
int n = (2 != 3) ? 5 : 9;
表达式1和表达式2必须同种类型.
String s = (3 > 4) ? "abc" : "qqq"; // s中的值是"qqq"
字符串和int的互转
class Test1 {
public static void main(String[] args) {
int n1 = 923423;
//String s1 = n1;
//int => String : "" + n1;
String s1 = "" + n1;
String s2 = "2342";
// String => int
//int n2 = s2;
// 把括号中的字符串s2中的内容转换为真的int值
int n2 = Integer.parseInt(s2);
System.out.println(n2);
运算符优先级:
-
运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行
-
只有单目运算符、三元运算符、赋值运算符是从右向左运算的。
最高的是 . 和 ()
最低的是 =
| . () {} ; , | |
|---|---|
| R—>L | ++ -- ~ !(data type) |
| L—>R | * / % |
| L—>R | + - |
| L—>R | << >> >>> |
| L—>R | < > <= >= instanceof |
| L—>R | == != |
| L—>R | & |
| L—>R | ^ |
| L—>R | | |
| L—>R | && |
| L—>R | || |
| R—>L | ? : |
| R—>L | = *= /= %= |
| += -= <<= >>= | |
| >>>= &= ^= |= |
高
![]()
低
浙公网安备 33010602011771号