运算符

运算符

位运算符

 

<<左移空位补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整除

  1. 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

aba&ba|b!aa^ba&&ba||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

a || b , 如果a为true, 结果一定也是true, 所以短路b操作

三元运算符

格式:变量 = (布尔表达式) ? 表达式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 = *= /= %=
  += -= <<= >>=
  >>>= &= ^= |=

 

 

posted @ 2022-04-15 21:22  叶舞  阅读(95)  评论(0)    收藏  举报