1 算术运算符
运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 余 |
2 赋值运算符
运算符 | 描述 |
---|---|
= | |
+= | |
-= | |
*= | |
/= | |
%= | |
++ | |
– | |
&= | 位与 |
|= | 位或 |
^= | 位非 |
>>= | 向右移位 |
<<= | 向左移位 |
//>>=
int a1 = 12;
//a1 >>=2 --> a1 = a1 >> 2
//1100 --> 0011 = 3
a1 >>= 2;
System.out.println(a1);//3
//<<=
int a2 = 5;
//a2 <<= 2 --> a2 = a2 >> 2
//0101 --> 10100 = 20
a2 <<= 2;
System.out.println(a2);//20
//&=
int b1 = 10;
//b1 &= 5 --> b1 = b1 & 5
//1010 & 0101 = 0000 = 0
b1 &= 5;
System.out.println(b1);//0
//|=
int b2 = 10;
//b2 |= 5 --> b2 = b2 | 5
//1010 | 0101 = 1111 = 15
b2 |= 5;
System.out.println(b2);//15
//^=
int b3 = 10;
// b3 ^= 6 --> b3 = b3 ^ 6
// 1010 ^ 0110 = 1100 = 12
b3 ^= 6;
System.out.println(b3);//12
3 比较运算符
运算符 | 描述 |
---|---|
== | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
4 逻辑运算符
运算符 | 描述 |
---|---|
&& | 短路与 |
|| | 短路或 |
! | 非 |
& | 逻辑与 |
| | 逻辑或 |
5 位运算符
运算符 | 描述 |
---|---|
<< | 左移 |
>> | 右移 |
>>> | 无符号右移 |
| | 或 |
& | 与 |
^ | 异或 |
~ | 非 |
1) 与 &
当相同的位上均为1时结果为1,否则结 果为0
//练习1:
// 12 --> 1100
// 5 --> 0101
// 1100 & 0101 = 0100 = 4
System.out.println(12 & 5);//
//练习2:
// 7 --> 0111
// 9 --> 1001
// 0111 & 1001 = 0001 = 1
System.out.println(7 & 9);//1
2) 或 |
当两边操作数的位有一边为1时,结果为1,否则为0
//练习1:
//7 --> 0111
//9 --> 1001
//0111 | 1001 = 1111 = 15
System.out.println(7 | 9);//15
//练习2:
//4 --> 0100
//8 --> 1000
//0100 | 1000 = 1100 = 12
System.out.println(4 | 8);//12
3) 异或 ^
两边的位不同时,结果为1,否则为0
//练习1:
// 12 --> 1100
// 5 --> 0101
// 1100 ^ 0101 = 1001 = 9
System.out.println(12 ^ 5);//9
//练习2:
// 8 --> 1000
// 9 --> 1001
// 1000 ^ 1001 = 0001 = 1
System.out.println(8 ^ 9);//1
4) 非 ~
将数字补码取反 1变0 0变1
//练习1:
byte a = 10;
//a 转换为二进制 00001010
//因为是正数 原码 = 反码 = 补码
//补码为00001010
//补码通过非~进行取反
//得到结果为 11110101
//此数为补码 第1位为1 是负数
//11110101(补码) --> 11110100(反码) --> 10001011(原码)
//10001011 = -11
System.out.println(~a);//-11
//练习2:
//8默认为int类型 占用内存为4字节 = 32比特
//转换为二进制为32位 0+23个0+00001000
//因为是正数 原码 = 反码 = 补码
//补码为 0+23个0+00001000
//补码通过非~进行取反
//得到结果为 1+23个1+11110111
//此数为补码 第1位为1 是负数
//1+23个1+11110111 (补码) 转换成反码
//1+23个1+11110110(反码) 转换成原码
//1+23个0+00001001(原码) = -9
System.out.println(~8);//-9
//练习3:
short s = -7;
//-7的二进制为 1 0000000 00000111(原码)
//1 1111111 11111000(反码)
//1 1111111 11111001(补码)
//补码通过非~进行取反
//0 0000000 00000110(补码)
//因为是正数 原码 = 反码 = 补码
//0 0000000 00000110(原码) = 6
System.out.println(~s);//6
5) 左移/右移
左移<< 右移>>
在机器中,数的二进制都是其补码
正数:源码 = 反码 = 补码
负数: 反码符号位不变化,其余位数取反,补码即为反码+1
// 正数
System.out.println(5<<2);// 运行结果是20
System.out.println(5>>2);// 运算结果是1
// 负数
// 负数的左移和整数左移一样,在右边补0,负数左移不会特殊处理符号位,所以一个负数在左移的过程中会有正有负的情况,如果一直左移,会变成0
// 负数的右移需要保证数为负数,所以操作对负数的二进制位左边补1,如果一直右移,最终会变成-1,即 (-1) >> 1 是 -1
System.out.println(-5 << 2);// 运算结果 -20
// -5的二进制位 1111 1111 1111 1111 1111 1111 1111 1011 此为补码
// 右移两位变成 1111 1111 1111 1111 1111 1111 1111 1110
// 在变成原本的也就是-2
System.out.println(-5 >> 2);// 运算结果 -2
6) 无符号右移
注意: 没有无符号左移
无符号左移 <<< 无符号右移 >>>
无符号右移和右移的区别是:
负数进行无符号右移的时候前面补0
负数进行右移的时候,前面补1
// 结果1
System.out.println(5 >>> 2);
// 结果536870911
System.out.println(-5 >>> 3);