JAVA位运算等运算符总结
一、概述
运算符是一种“功能”符号,用以通知 Java 进行相关的运算。
Java 语言中常用的运算符可分为如下几种:
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 条件运算符
- 位运算符
如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。
二、算数运算符
就是加减乘除这些,没什么可说的。
+ - * / % ++ --
加 减 乘 除 取余 自增 自减
三、赋值运算符
就是把右边的值运算之后赋值给左边,没什么可说的。
= 右边值给左边
+= 左右相加给左边
-= 左右相减给左边
*= 左右相乘给左边
/= 左右相除给左边
%= 左右取余余数给左边
<<= 左边数据左移位赋值给左边
>>= 左边数据右移位赋值给左边
&= 按位与赋值运算符
^= 按位异或赋值操作符
|= 按位或赋值操作符
四、比较运算符
就是判断两个数据的大小,没什么可说的。
== 判断是否相等
!= 判断是否不等
> 判断是否大于
< 判断是否小于
>= 判断是否大于等于
<= 判断是否小于等于
五、逻辑运算符
就是操作两个boolean类型,还是有点可说的。
&& 短路与 (符号两边左边为假,就是假,右边可能会被短路。两边都是真则为真)
|| 短路或 (符号两边任何一个为真,就是真,右边可能会被短路。两边都是假则为假)
& 逻辑与 (符号两边都是真则为真,其余为假,和短路与意义一样,但是右边肯定会执行,执行完合并判断)
| 逻辑或 (符号两边任何一个为真,就是真,和短路或意义一样,但是右边肯定会执行,执行完合并判断)
! 逻辑非 (用来反转操作数的逻辑状态)
^ 逻辑异或 (符号两边结果相同为假,不同则为真)
可以将boolean的true和false看作是1和0,这样&和|的意义就是按位与和按位或。
六、条件运算符
就是? : 也称为 “三元运算符”,没什么可说的。
语法形式:布尔表达式 ? 表达式1 :表达式2
2 > 1 ? 2 : 1
结果是2
冒号前面的放true的逻辑,后面放false的逻辑。
七、位运算符
位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。作用在所有的位上,并且按位运算
& 与,如果相对应位都是1,则结果为1,否则为0
| 或,如果相对应位都是 0,则结果为 0,否则为 1
^ 异或,如果相对应位值相同,则结果为0,否则为1
〜 取反,按位取反运算符翻转操作数的每一位,即0变成1,1变成0。
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。
按位操作,首先要知道不同类型字节长度,网上都是显示一个字节8位,不是每个数字都是8位的。但你可以将计算过程以8位来算。
不同类型长度如下:
| 类型 | 字节 | 位 | 长度 | 范围(可以在源码里查看) | | ------ | ------ | ------ | ---- | --------------------------------- | | byte | 1 byte | 8 bit | 2^8 | -2^7, 2^7-1 | | char | 2 byte | 16 bit | 2^16 | u0000~uFFFF | | int | 4 byte | 32 bit | 2^32 | -2^31, 2^31-1 | | short | 2 byte | 16 bit | 2^16 | -2^15, 2^15-1 | | long | 8 byte | 64 bit | 2^64 | -2^63, 2^63-1 | | double | 8 byte | 64 bit | 2^64 | 4.9e-324, 1.7976931348623157e+308 | | float | 4 byte | 32 bit | 2^32 | 1.4e-45f, 3.4028235e+38f |
做位操作,还要明白什么是原码,反码,补码。
- 正数的原码,反码,补码都一样;
- 负数的反码是对除了符号位(最高位)对原码取反,补码是对反码+1,负数原码和正数原码除最高位不一样其他位一样。
计算机计算是用的补码
负数以补码看原码,先减1看反码,再反转看原码。
以int整型32位,带负数为例子(正数的太简单了,略过):
按位与&(补码):
数字1:00000000000000000000000000000001
数字-128:11111111111111111111111110000000
&结果:00000000000000000000000000000000
1 & -128 = 0
数字-1:11111111111111111111111111111111
数字-128:11111111111111111111111110000000
&结果:11111111111111111111111110000000
-1 & -128 = -128
按位或|(补码):
数字1:00000000000000000000000000000001
数字-128:11111111111111111111111110000000
|结果:11111111111111111111111110000001
1 | -128 = -127
数字-1:11111111111111111111111111111111
数字-128:11111111111111111111111110000000
|结果:11111111111111111111111111111111
-1 | -128 = -1
按位异或^(补码):
数字1:00000000000000000000000000000001
数字-128:11111111111111111111111110000000
^结果:11111111111111111111111110000001
1 ^ -128 = -127
数字-1:11111111111111111111111111111111
数字-128:11111111111111111111111110000000
^结果:00000000000000000000000001111111
-1 ^ -128 = 127
按位取反〜(补码):
数字1:00000000000000000000000000000001
〜结果:11111111111111111111111111111110
~1 = -2
数字-128:11111111111111111111111110000000
〜结果:00000000000000000000000001111111
~-128 = 127
按位左移<<(补码):
数字1:00000000000000000000000000000001
左移4位(<<4)结果:00000000000000000000000000010000
1 << 4 = 16
数字-128:11111111111111111111111110000000
左移4位(<<4)结果:11111111111111111111100000000000
-128 << 4 = -2048
按位右移>>(补码):
数字1:00000000000000000000000000000001
右移4位(>>4)结果:00000000000000000000000000000000
1 >> 4 = 0
数字-128:11111111111111111111111110000000
右移4位(>>4)结果:11111111111111111111111111111000
-128 >> 4 = -8
无符号右移>>>(补码):
数字1:00000000000000000000000000000001
右移4位(>>>4)结果:00000000000000000000000000000000
1 >>> 4 = 0
数字-128:11111111111111111111111110000000
右移4位(>>>4)结果:00001111111111111111111111111000
-128 >>> 4 = 268435448