Java学习总结(16.05.31)Java位运算符

来源:互联网 发布:怎样下载视频软件 编辑:程序博客网 时间:2024/05/16 00:53

个人认为,位运算符是Java运算符中比较容易遗忘的运算符。位运算符多用于对数据进行底层操作,Java的位运算符有7种,下面将其一一列出以便必要时查找。


按位与(&)(双目双目运算符)  

对两个操作数的补码逐位进行对比,若两操作数的补码同一位都为1,则所得结果的补码对应的位为1,否则为0.,将补码化成原码即可得到结果

例:   -5 & 3 = 3

十进制                 

                                  原码

                                 反码

                                   补码

-5

   1000 0000 0000 0000 0000 0000 0000 0101

  1111 1111 1111 1111 1111 1111 1111 1010

   1111 1111 1111 1111 1111 1111 1111 1011

3

   0000 0000 0000 0000 0000 0000 0000 0011

   0000 0000 0000 0000 0000 0000 0000 0011

   0000 0000 0000 0000 0000 0000 0000 0011

-5 & 3=3

   0000 0000 0000 0000 0000 0000 0000 0011

   0000 0000 0000 0000 0000 0000 0000 0011

   0000 0000 0000 0000 0000 0000 0000 0011

 

按位或(|) (双目运算符)

对两个操作数的补码逐位进行对比,若某一位中有一个或以上操作数的补码为1,则所得结果的补码对应的位为0,若两操作数的补码同一位都为1,则所得结果的补码对应的位为0,将所得补码化成原码即可的到结果。

例:   -5 | 3= -5

十进制   

    原码

反码

补码

-5

1000 0000 0000 0000 0000 0000 0000 0101

 1111 1111 1111 1111 1111 1111 1111 1010

1111 1111 1111 1111 1111 1111 1111 1011

3

0000 0000 0000 0000 0000 0000 0000 0011

 0000 0000 0000 0000 0000 0000 0000 0011

0000 0000 0000 0000 0000 0000 0000 0011

-5 | 3=-5

1000 0000 0000 0000 0000 0000 0000 0101

 1111 1111 1111 1111 1111 1111 1111 1010

1111 1111 1111 1111 1111 1111 1111 1011


按位异或(^)(双目运算符)   用这个运算符是不能进行指数运算的

对两个操作数的补码逐位进行对比,若某一位中两个操作数的补码不一致时(一个为1,一个为0),则所得结果的补码对应的位为1,否则为0,将所得补码化成原码即可得到运算结果。

例:   -5 ^ 3=-8

十进制

原码

反码

补码

-5  

1000 0000 0000 0000 0000 0000 0000 0101    

1111 1111 1111 1111 1111 1111 1111 1010       

1111 1111 1111 1111 1111 1111 1111 1011

3

0000 0000 0000 0000 0000 0000 0000 0011

0000 0000 0000 0000 0000 0000 0000 0011

0000 0000 0000 0000 0000 0000 0000 0011

-5 ^ 3=-8

1000 0000 0000 0000 0000 0000 0000 1000

1111 1111 1111 1111 1111 1111 1111 0111

1111 1111 1111 1111 1111 1111 1111 1000


按位取反(~)(单目运算符)

对操作数的补码进行运算,对操作符的补码的每一位取反(1变成0, 0变成1),将所得补码化成原码即可的到取反结果。

例:……-5 = 4

十进制

原码

反码

补码

-5

1000 0000 0000 0000 0000 0000 0000 0101

1111 1111 1111 1111 1111 1111 1111 1010

1111 1111 1111 1111 1111 1111 1111 1011

^-5 = 4

0000 0000 0000 0000 0000 0000 0000 0100

0000 0000 0000 0000 0000 0000 0000 0100

0000 0000 0000 0000 0000 0000 0000 0100


按位左移(<<) (双目运算符)

将左操作数的补码向左移动右操作数个位(例如,若右操作数位2,则将左操作数的补码左移两位),,然后右边空出的若干位用0补上,再将左边超出去的若干位摄取,即可得到计算结果的补码,将所得补码化成原码即可得到运算结果

例:     -5 << 3 = -40

十进制

原码

反码

补码

-5

1000 0000 0000 0000 0000 0000 0000 0101

1111 1111 1111 1111 1111 1111 1111 1010

        1111 1111 1111 1111 1111 1111 1111 1011

-5<<3 = -40

1000 0000 0000 0000 0000 0000 0010 1000

1111 1111 1111 1111 1111 1111 1101 0111

111 1111 1111 1111 1111 1111 1111 1101 1000

(红色的截断)             (蓝色的位新补上的0)

按位右移 (>>)(双目运算符)

计算原理与按位左移相似,按位右移运算符对左操作数的补码进行右移,左边空出的位用符号为的数字补充,右边超出去的位则摄取。


 无符号右移(>>>)(双目运算符)

无符号右移运算符计算方式与按位右移相似,不同的是,无符号右移运算符将补码右移后,左边空出的位都用0来补充。



另外,& | ~这三个运算符还可以对布尔值进行运算

operator

true op true

 true op false

False op false

&

   true

false

false

|

   true

true

false

^

  false

true

false

& | ^ 这三个运算符都符合交换律

 &  、|  与逻辑运算符&&,|| 的运算结果一样但运算规则不一样:前者对两个布尔型的操作数都会进行判断,例如ture | true,系统判断完左操作数之后会再判断右操作数然后才会返回结果,而true|| true则是系统判断第一个操作数为true时就会直接返回true。

^对布尔值的运算:当左右两个布尔值不一致(相异)时返回true,否则返回false。

0 0