运算符分类
运算符指明对操作数的运算方式。组成表达式的Java操作符有很多种。运算符按照其要求的操作数数目来分,可以有单目运算、双目运算符和三目运算符。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。
算数
单目运算 +(取正)-(取负) ++(自增) - -(自减)
双目运算 + - × / % 取模
三目运算 :a>b ? true : false 当a>b时返回true 否则返回false
关系
等于符号:==,不等于符号:!= ,大于符号:>, 小于符号:<,大于等于符号:>= ,小于等于符号:<=
位与逻辑
位运算符 与(&)、非(~)、或(|)、异或(^)
赋值运算
= += -= *= /= %= &= ^= |= <<= >>=
位移 只能处理正整数运算符,char、short、byte在进行位移运算时都将会转换成int类型,运算结果也是int类型
运算符演示
与 ( & ) 当 & 的两边是数字时进行按位运算,当 & 的两边是boolean时执行逻辑判断。
& 和 && 的区别
int a =1 , b = 2 ,c = 3; a == b && b == c //当a != b 时 直接返回 false 不进行b== c 判断 a == b & b == c //当a!=b时 还要进行b ==c 的判断
& 进行数字运算
3&6 = 2
0011 // 3的二进制结果
0110 // 6的二进制结果
0010 // 计算结果 当上下两位同时为1时结果为1
或(|) 当 | 的两边是数字时进行按位运算,当 | 的两边是boolean时执行逻辑判断。 | 和 || 的区别同上
| 进行数字运算
3|6 = 7
0011 // 3的二进制结果
0110 // 6的二进制结果
0111 // 计算结果 当上下两位有一位为1 结果为1
非(~) ~3 = -4
0000 0011 // 3的二进制结果
1111 1100 // 取反 如果为0结果为1 如果为1结果为0
0000 0100 //高位等于1所以原码等于负数,负数取反高位不变在末尾加1
异(^)
6^3 = 5
0011 // 3的二进制结果
0110 // 6的二进制结果
0101 // 计算结果 相同结果为0 不同结果为1
<< 带符号左移
3 << 2 = 12
0011 // 3的二进制结果
1100 //向右移动两位后结果
<< 带符号右移
3 >> 2 == 0
0011 // 3的二进制结果
0000 //向右移动两位后结果
整数的位移比较简单,下面咋们看一下负数的位移。负数在进行位移前,对其进行按位取反,取反后在进行位移操作。 负数位移的秘籍:负数位移时先将2进制码取反加一,然后进行位移,符号位不变,左移则其后补零,右移则其前补1,然后按位取反加一。 整数取反就是其本身,负数取反符号位不变,其余书进行取反
-3 >> 2 = -1
1000 0011 // -3的二进制原码
1111 1101 // -3的二进制反码 加一
1111 1111 // 移位后结果 符号位不变 向右移其前补1
1000 0001 //负数取反 符号位不变,加一后二进制码,
-3 >>> 2 = 1073741823 无符号位移
1000 0000 0000 0000 0000 0000 0000 0011 //-3 的四字节二进制原码
1111 1111 1111 1111 1111 1111 1111 1101 //-3 的二进制反码
0011 1111 1111 1111 1111 1111 1111 1111 //无符号位移后肯定是整数,所以不需要进行转码,直接转换为10 进制,结果为 1073741823
a+b 和 a+=b 的区别
short a = 4 ; int b = 5; a+=b ; //可以成功编译,在进行计算时会自动进行高精度类型转换 a= a+b ; //类型不一致,会报错