在Java中,位运算符是对二进制位进行操作的运算符。位运算符可用于位操作,位操作可以用于优化计算机程序的处理速度。
一、位运算符的种类
Java中共有6个位运算符:
- & 按位与:对两个数的二进制进行按位与操作,只有都为1时,结果才为1。
- | 按位或:对两个数的二进制进行按位或操作,只要有一个为1时,结果就为1。
- ^ 按位异或:对两个数的二进制进行按位异或操作,不同为1,相同为0。
- ~ 按位取反:对一个数的二进制进行按位取反,0变为1,1变为0。
- > 右移:将一个数的二进制按照指定位数向右移动,超出部分舍弃,空位以符号位补位。
- << 左移:将一个数的二进制按照指定位数向左移动,超出部分舍弃,空位补0。
二、位运算符的作用
位运算符常用于以下场景:
- 将整数转换为二进制或十六进制
- 对整数进行快速除法或乘法计算
- 对数字的某些位进行操作
int num = 10; //输出二进制形式 System.out.println(Integer.toBinaryString(num)); //输出十六进制形式 System.out.println(Integer.toHexString(num));
//等同于num*2^3 int result = num << 3; //等同于num/2^3 int result = num >> 3;
//将num的第2位设置为1 int result = num | 0b10; //将num的第4位设为0 int result = num & ~0b1000;
三、注意事项
位运算符操作的对象必须是整型(byte、short、int、long),不能用于浮点型。
对于<<和>>运算,若左操作数是int类型,则移动1~31位的结果为int类型;若左操作数是long类型,则移动1~63位的结果为long类型。
对于>>>运算(无符号位移运算),一律将空缺处补0,即使最左边一位是1也不例外(因此Java不支持无符号整数类型)。
四、实例演示
public class BitwiseOperatorDemo { public static void main(String[] args) { int a = 60; /* 60 = 0011 1100 */ int b = 13; /* 13 = 0000 1101 */ int c = 0; c = a & b; /* 12 = 0000 1100 */ System.out.println("a & b = " + c ); c = a | b; /* 61 = 0011 1101 */ System.out.println("a | b = " + c ); c = a ^ b; /* 49 = 0011 0001 */ System.out.println("a ^ b = " + c ); c = ~a; /*-61 = 1100 0011 */ System.out.println("~a = " + c ); c = a << 2; /* 240 = 1111 0000 */ System.out.println("a << 2 = " + c ); c = a >> 2; /* 15 = 1111 */ System.out.println("a >> 2 = " + c ); c = a >>> 2; /* 15 = 0000 1111 */ System.out.println("a >>> 2 = " + c ); } }