位运算符用来对二进制位进行操作,每一位的取值为 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