
本文详解Java中&运算符的两种核心用途:作为短路逻辑与&&的非短路替代,以及更关键的按位与操作——尤其在位掩码、状态提取等底层数据处理中不可或缺。
本文详解java中`&`运算符的两种核心用途:作为短路逻辑与`&&`的非短路替代,以及更关键的按位与操作——尤其在位掩码、状态提取等底层数据处理中不可或缺。
在Java中,&是一个多义运算符,其行为取决于操作数类型:当操作数为布尔类型时,&执行非短路逻辑与(即无论左操作数结果如何,右操作数始终会被求值);而当操作数为整数类型(如int、byte等)时,&执行按位与(bitwise AND)——这是它在系统编程、游戏开发(如Pac-Man教程)、硬件交互等场景中最常见且最重要的用途。
以你提供的代码为例:
int ch = 0, pos = 0;
if ((ch & 16) != 0) {
screenData[pos] = (int) (ch & 15);
}此处的 ch & 16 和 ch & 15 均为按位与运算,而非逻辑判断。我们来逐行解析:
- 16 的二进制表示为 10000(即第5位为1,其余为0),因此 ch & 16 的作用是检测 ch 的第5位(从低位起索引为4)是否为1。若结果非零,说明该位被置位,常用于标志位(flag)检查。
- 15 的二进制为 1111(4个低位全为1),ch & 15 则实现低位掩码(bit masking):仅保留 ch 的最低4位,其余高位全部清零。这相当于 ch % 16 的高效替代(无除法开销),常用于将数值映射到0–15的范围(例如图块索引、颜色通道提取等)。
✅ 正确用法示例:
立即学习“Java免费学习笔记(深入)”;
int flags = 21; // 二进制: 10101 boolean hasFlag4 = (flags & 16) != 0; // true — 第5位为1 int low4Bits = flags & 15; // 结果: 5 (二进制 0101)
⚠️ 注意事项:
- 切勿混淆 & 与 &&:if (a != null & a.isValid()) 会强制调用 a.isValid(),即使 a 为 null,导致 NullPointerException;而 && 会短路,更安全。
- 按位与是低开销位操作,编译器通常能优化为单条CPU指令,在性能敏感场景(如游戏循环、嵌入式逻辑)中优于模运算或条件分支。
- 使用十六进制字面量可提升可读性:ch & 0xF 等价于 ch & 15,ch & 0x10 等价于 ch & 16。
总结:在Pac-Man这类基于数组索引和状态编码的程序中,& 是精准操控二进制位的核心工具——它不用于“真假判断”,而是用于解包紧凑存储的数据字段。理解位运算,是迈向高效、底层Java开发的关键一步。


















