一、什么是位运算?使用位运算有什么好处?
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转换成计算机可执行的二进制操作指令,位运算省略了中间转换的操作,处理器直接操作所以更快