java提供的位运算符
- 一元操作符:位非:
~
。 - 二元操作符:左移:
<<
; 右移:>>
; 无符号右移:>>>
(左移没有符号的问题); 位与:&
; 位或:|
; 位异或:^
。
位非:~
例如: ~5
结果为-6, 首先5将被转换为2进制数,然后按位取反,结果转换为原数据类型。
左移:<<
相当于乘以2,例如:5<<2
表示将5的二进制数左移两位,低位补0,结果为20。
右操作数根据数据类型需要进行模32(int)或模64(long)的运算,即 1<<35
等于1<<3
。
右移:>>
相当于除以2,左移反过来,高位补原本符号位的数,即0000 1111
右移两位为0000 0011
, 1111 0000
右移两位为1111 1100
。
右操作数根据数据类型需要进行模32(int)或模64(long)的运算,即 1>>35
等于1>>3
。
无符号右移
高位补0。
位与:&
/ 位或:|
/ 位异或:^
一样的,先转为二进制,然后按位取与/或/异或。
&
和|
在boolean值的应用
&
和|
也可以用于boolean的运算,但是不同于&&
和||
,&
和|
不采用“短路”的方式来求值,即两个操作数都会进行计算。例如:1 == 2 || 2 == 2
在计算第一个表达式为false后不会继续计算第二个表达式,而1 ==2 | 2 == 2
会计算两个表达式的值。
一些应用
可以看https://my.oschina.net/xianggao/blog/412967,列举了很多常用的应用。