Java中位运算详解

最近在做题时候,经常遇到位运算,这里对java中的位运算i做一个总结,以便复习。

 

一、什么是位运算?使用位运算有什么好处?

1、什么是位运算?

    计算机在底层使用的是二进制补码进行运算。对应的二进制位进行操作,计算机只识别0和1。

2、位运算的好处:

    巧妙的使用位运算可以大量减少运行开销,优化算法。

二、Java支持的7个位运算符

&:与运算符

|:或运算符

~:非运算符

^:异或运算符

>>:右移运算符

<<:左移运算符

>>>:无符号右移运算符

三、Java中位运算符的实际使用

位移操作:(只针对int类型的有效,Java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).也可作用于以下类型,即 byte,short,char,long(它们都是整数形式)。当为这四种类型时,JVM先把它们转换成int型再进行操作。

1、与(&)运算符,两个都为1时才为1,其他情况均为0

例:-5 & 4

   -5的二进制形式为:11111111 11111111 11111111 11111011

    4的二进制形式为:00000000 00000000 00000000 00000100

    进行逻辑运算后为:00000000 00000000 00000000 00000000

    转换为十进制为:0

2、或(|)运算符,两个都为0时才为0,其他情况均为1

例:-5 | 4

    -5的二进制形式为:11111111 11111111 11111111 11111011

    4的二进制形式为:00000000 00000000 00000000 00000100

    进行逻辑运算后为:11111111 11111111 11111111 11111111

    转换为十进制为:-1

3、非(~)运算符,取反,即1变为0,0变为1

例: ~(-5)

    -5的二进制形式为:11111111 11111111 11111111 11111011

    取反后的二进制形式为:00000000 00000000 00000000 00000100

    转换为十进制为:4

4、异或(^)运算符,相同值为0,不同值为1

例:-5 ^ 4

    -5的二进制形式为:11111111 11111111 11111111 11111011

    4的二进制形式为:00000000 00000000 00000000 00000100

    进行逻辑运算后为:11111111 11111111 11111111 11111111

    转换为十进制为:-1

5、右移(>>)运算符,m>>n,把m的二进制数右移n位,m为正数,高位全部补0,m为负数,高位全部补1

注意:在数字没有溢出的情况下:m>>n相当于m除以2的n次方,得到的数为整数时,即为结果,得到的数为负数时,根据m的有值两种情况

1.m为正数时,得到的商会舍弃小数位

2.m为负数时,得到的商会舍弃小数位,然后把整数部分+1得到结果

例1:5>>2


    5的二进制形式为:00000000 00000000 00000000 00000101

    进行逻辑运算后为(右移两位):00000000 00000000 00000000 00000001

    转换为十进制为:1

例2:5>>4


    5的二进制形式为:00000000 00000000 00000000 00000101

    进行逻辑运算后为(右移四位):00000000 00000000 00000000 00000000

    转换为十进制为:0

注意:这里舍弃了小数点后面的

例3:-5>>2

     -5的二进制形式为:11111111 11111111 11111111 11111011

    进行逻辑运算后为(右移两位):11111111 11111111 11111111 11111110

    转换为十进制为:-2

6、左移(<<)运算符,m<<n,把m的二进制数左移n位,高位超出n位都舍弃,低位补0(此时可能出现正数变负数)

注意:在数字没有溢出的情况下,对于整数和负数,m<<n相当于m乘以2的n次方。


例1:5<<2

    5的二进制形式为:00000000 00000000 00000000 00000101

    进行逻辑运算后为(左移两位):00000000 00000000 00000000 00010100

    转换为十进制为:20

例2:5<<29


    5的二进制形式为:00000000 00000000 00000000 00000101

    进行逻辑运算后为(左移两位):10100000 00000000 00000000 00000000

    转换为十进制为:-1610612736

7、无符号右移(>>>)运算符,m>>>n,整数m表示的二进制右移n位,不论正负数,高位都补0

例1: 5>>>2

    5的二进制形式为:00000000 00000000 00000000 00000101

    进行逻辑运算后为(无符号右移两位):00000000 00000000 00000000 00000001

    转换为十进制为:1

例2:-5>>>2

    -5的二进制形式为:11111111 11111111 11111111 11111011

    进行逻辑运算后卫(无符号右移两位):00111111 11111111 11111111 11111110

    转换为10进制为:1073741822

四、总结

位运算快的原因是直接跟计算机的底层二进制机器操作指令,而我们的程序代码运算最终也是由JVM转换成计算机可执行的二进制操作指令,位运算省略了中间转换的操作,处理器直接操作所以更快
 

猜你喜欢

转载自blog.csdn.net/m0_46405589/article/details/115309902