位运算符用来对二进制位进行操作,每一位的取值为 0 或 1。如下图:

上图中,十进制 57(十六进制 39,八进制为 71)的二进制为 0011 1001,其中包含了 8 个位,位操作符就是对这些 0 和 1 进行操作。
Java 中位运算符用于对整型数据的二进制位进行运算,具体包括如下:
~ 按位取反,即 0 取反为 1,1 取反为 0
& 按位与,即 1 和 1 进行与运算为 1,其它均为 0
| 按位或,即 0 和 0 进行或运算为 0,其它均为 0
^ 按位异或,即 1 和 0,或者 0 和 1 进行或运算为 1,其它均为 0
下表是 Java 位运算的逻辑规则:
| a | b | ~a | a & b | a | b | a ^ b |
| 1 | 1 | 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 0 | 1 | 1 |
| 0 | 0 | 1 | 0 | 0 | 0 |
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
int a = 20, b = 35;
// 注意 Integer.toBinaryString() 方法是 Integer 类中的静态工具方法
// 用来将数字使用二进制字符串显示
System.out.println(" a=" + format(Integer.toBinaryString(a)));
System.out.println(" b=" + format(Integer.toBinaryString(b)));
// 按位取反
System.out.println(" ~a=" + format(Integer.toBinaryString(~a)));
// 按位与
System.out.println("a&b=" + format(Integer.toBinaryString(a & b)));
// 按位或
System.out.println("a|b=" + format(Integer.toBinaryString(a | b)));
// 按位异或
System.out.println("a^b=" + format(Integer.toBinaryString(a ^ b)));
}
/**
* 格式化字符串,保持字符串长度为32,如果长度不够,左边填充字符0
* @param str 带格式化字符串
* @return
*/
private static String format(String str) {
if(str.length() > 32) {
return str;
}
// 实现左端用字符0补齐
char[] chars = new char[32 - str.length()];
Arrays.fill(chars, '0');
String tmpStr = String.copyValueOf(chars) + str;
// 这里使用了 Java 的 StringBuilder,后续会介绍
StringBuilder buffer = new StringBuilder();
for(int i = 0; i < tmpStr.length(); i++) {
if(i > 0 && i % 8 == 0) {
buffer.append(" ");
}
buffer.append(tmpStr.charAt(i));
}
return buffer.toString();
}
}运行示例,输出结果如下:
a=00000000 00000000 00000000 00010100 b=00000000 00000000 00000000 00100011 ~a=11111111 11111111 11111111 11101011 a&b=00000000 00000000 00000000 00000000 a|b=00000000 00000000 00000000 00110111 a^b=00000000 00000000 00000000 00110111