学科分类
目录
Java基础

位运算符

位运算符是针对二进制数的每一位进行运算的符号,它是专门针对数字0和1进行操作的。接下来通过一张表来展示Java中的位运算符及其用法,如表1所示。

表1 位运算符

运算符 运算 范例 结果
& 按位与 0 & 0 0
& 按位与 0 & 1 0
& 按位与 1 & 1 1
& 按位与 1 & 0 0
| 按位或 0 | 0 0
| 按位或 0 | 1 1
| 按位或 1 | 1 1
| 按位或 1 | 0 1
~ 取反 ~0 1
~ 取反 ~1 0
^ 按位异或 0 ^ 0 0
^ 按位异或 0 ^ 1 1
^ 按位异或 1 ^ 1 0
^ 按位异或 1 ^ 0 1
<< 左移 00000010<<2 00001000
<< 左移 10010011<<2 01001100
>> 右移 01100010>>2 00011000
>> 右移 11100010>>2 11111000
>>> 无符号右移 01100010>>>2 00011000
>>> 无符号右移 11100010>>>2 00111000

从表1可以看出,Java中的位运算符本质都是针对二进制数0和1进行运算的,所以,在使用位运算符时,都会先将操作数转换成二进制数的形式进行位运算,然后将得到的结果再转换成想要的进制数。

接下来通过一些具体示例对表2-10中描述的位运算符进行详细讲解。为了方面描述,下面的运算都是针对一个byte类型的数,也就是一个字节大小的数的运算,具体如下:

1.位运算符“&”是将参与运算的两个操作数以二进制数的形式进行“按位与”运算,如果相同位上的两个二进制位都为1,则该位的运算结果为1,否则为0。

例如将6和 11进行按位与运算,一个byte类型的数字6对应的二进制数为00000110,数字11对应的二进制数为00001011,具体演算过程如下所示:

00000110

​ &

00001011

—————————

00000010

运算结果为00000010,对应十进制数值2。

2.位运算符“|”是将参与运算的两个操作数以二进制数的形式进行“按位或”运算,如果相同位上的两个二进制位有一个值为1,则该位的运行结果为1,否则为0。

例如将6与11进行或运算,具体演算过程如下:

00000110

​ |

00001011

—————————

00001111

运算结果为00001111,对应十进制数值15。

3.位运算符“~”只针对一个操作数进行操作,它会对二进制形式的操作数每位进行取反操作。如果二进制位是0,则取反值为1;如果是1,则取反值为0。

例如将6进行取反运算,具体演算过程如下:

~ 00000110

—————————

11111001

运算结果为11111001,对应十进制数值-7。

4.位运算符“^”是将参与运算的两个操作数以二进制数的形式进行“异或”运算,如果相同位上的两个二进制数值相同,则值为0,否则为1。

例如将6与11进行异或运算,具体演算过程如下:

00000110

^

00001011

—————————

00001101

运算结果为00001101,对应十进制数值13。

5.位运算符“<<”就是将操作数二进制形式的所有二进制位向左移动指定位数。运算时,左边移走的部分舍去,右边的空位补0。

例如一个byte类型的数字11用二进制表示为00001011,将它左移一位,具体演算过程如下:

00001011 <<1

—————————

00010110

运算结果为00010110,对应十进制数值22。

6.位运算符“>>“就是将操作数二进制形式的所有进制位向右移动指定位数。运算时,左边的空位根据原数的符号位补0或者1(原来是负数就全部补1,是正数就全部补0),右边移走的部分舍去。

例如一个byte类型的数字11用二进制表示为00001011,将它右移一位,具体演算过程如下。

00001011 >>1

—————————

00000101

运算结果为00000101,对应十进制数值5。

7.位运算符“>>>”属于无符号右移,就是将操作数二进制形式的所有二进制位不考虑正负数向右移动指定位数。运算时,左边的空位全部补0(不考虑原数正负),右边移走的部分舍去。

例如一个byte类型的数字11用二进制表示为00001011,将它无符号右移一位,具体演算过程如下:

00001011 >>>1

—————————

00000101

运算结果为00000101,对应十进制数值5。

点击此处
隐藏目录