JAVA位运算等运算符总结

时间:2022-07-22
本文章向大家介绍JAVA位运算等运算符总结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

JAVA位运算等运算符总结

一、概述

运算符是一种“功能”符号,用以通知 Java 进行相关的运算。

Java 语言中常用的运算符可分为如下几种:

  1. 算术运算符
  2. 赋值运算符
  3. 比较运算符
  4. 逻辑运算符
  5. 条件运算符
  6. 位运算符

二、算数运算符

就是加减乘除这些,没什么可说的。

+ - * / % ++ --
加 减 乘 除 取余 自增 自减

三、赋值运算符

就是把右边的值运算之后赋值给左边,没什么可说的。

= 右边值给左边
+= 左右相加给左边
-= 左右相减给左边
*= 左右相乘给左边
/= 左右相除给左边
%= 左右取余余数给左边
<<= 左边数据左移位赋值给左边
>>= 左边数据右移位赋值给左边
&= 按位与赋值运算符
^= 按位异或赋值操作符
|= 按位或赋值操作符

四、比较运算符

就是判断两个数据的大小,没什么可说的。

== 判断是否相等
!= 判断是否不等
> 判断是否大于
< 判断是否小于
>= 判断是否大于等于
<= 判断是否小于等于

五、逻辑运算符

就是操作两个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. 正数的原码,反码,补码都一样;
  2. 负数的反码是对除了符号位(最高位)对原码取反,补码是对反码+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