Java基础系列---操作符
还记得我们刚开始学习Java的时候记住优先级和逻辑运算符就可以开始工作了,昨天在看到源码的时候发现一个操作符 |=,没有印象,然后去搜了下,发现提到的文章也很少,今天去看了一下官文,然后去google找了一圈,总结下来,供自己和大家参考。
Java 提供一套丰富的操作运算符:
-
- 算术运算符
- 关系运算符
- 按位运算符
- 逻辑运算符
- 赋值运算符
- 其他
算术运算符
算术运算符和我们在数学中使用的一样,就是 + - * /等。
符号 | 示例 |
+(加法) | A + B |
- (减法) | A - B |
*(乘法) | A * B |
/ (除法) | A / B 比如 8 / 3 = 2(只取小数点之前的数字) |
%(取余) | A % B 比如 8 % 3 = 2 (取余数) |
++ | ++A 或者 A++ (第一个是返回之前加1,后面的是返回后加1) |
-- | 与 ++ 同理 |
关系运算符
比较用
符号 | 示例 |
== (等于) | A == B |
!= (不等于) | A != B |
>(大于) | A > B |
<(小于) | A < B |
>= (大于或者等于) | A>=B |
<= (小于或者等于) | A<=B) |
按位运算符
Java中有几个按位运算符,用于long, int, short, char 和byte
比如 a = 16, 00010000(在Java中,所有数据类型都是补码表示的,8位二进制为了方便直观的观看)
b = 3,00100000
-------------------------------------
a & b
a : 0 0 0 1 0 0 0 0
b : 0 0 1 0 0 0 0 0
等于 : 00000000
第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
---------------------------------------
a | b
a : 00010000
b : 00100000
等于 : 00110000
与&的运算正好相反,只要有一位是1,结果就是1
---------------------------------------
a ^ b
a : 00010000
b : 00100000
等于 : 00110000
第一个数与第二个数是否相反,是的话就是1,不是就是0
---------------------------------------
~a
a : 0001 0000
等于:
操作数的第n位为1,那么结果的第n位为0,反之
在Java中,所有数据类型都是补码表示的,没有特殊说明,默认是int,int长度是8位,1为是4字节,就是32字节。
所以上面的a 正确的表示是(补码)00000000 00000000 00000000 00010000
然后取反是11111111 11111111 11111111 11101111
到这里并没有结束,因为高位是1,所以结果会变为负数,负数的补码是其绝对值的原码取反,末尾再加1。
我们先末尾加1变为11111111 11111111 11111111 11101110 (这里是负数,负数 + 1)
然后负数取反变为 00000000 00000000 0000000 00010001
转换为 - 17
这里的这个负数加一 一定要注意,要不就像我一样,算半天始终不正确
--------------------------------------
在上边提到了补位的问题,其中上边已经提到了Java中所有数据都是以补位码形式存在的
我们这里再强调下,正数的原码、补码反码是一样的,负数的高位也就是符号位是1,补码和反码都是原码反过来 + 1.至于细节,我们在以后写出
----------------------------------------
至于<< 和>> 就简单了,只是在二进制的基础上 向左或者向右调整,即可。
在Java中 很多底层都用这种方法来处理数据,因为底层是用二进制进行表示的,直接用二进制进行处理当然是性能很高的
符号 | 描述 |
&(按位和) | 第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0。 |
| (按位或) | A | B |
^(按位异或) | A ^ B |
〜(按位赞美) | A ~ B |
<<(左移) | A<<B |
>>(右移) | A>>B |
>>>(零填充右移) | A >>>B 不管正负标志位,总是整体右移,左边用0来填充,右边舍弃 |
逻辑运算符
符号 | 描述 |
&& | 逻辑与运算符,2个条件为真才为真,这里有短路情况 |
|| | 逻辑或运算符,只要有一个为真,就为真 |
! | 逻辑非运算符,用于取反结果 |
赋值运算符
操作符 | 描述 | 例子 |
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A等价于C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
摘自https://www.tutorialspoint.com/java/java_basic_operators.html
上面标红的3列,大家可能要额外看一下。
其他
条件运算符
variable x = (expression) ? value if true : value if false
比如 int a = a == 3 ? 1 : 2;
instanceof运算符
( Object reference variable ) instanceof (class/interface type)
这里就是一个简单的验证 某类是否是某个类的子类