最直接有效的方式是使用按位与运算符 & 配合掩码 0xffffffff00000000l,因其高 32 位全 1、低 32 位全 0,可精准保留高 32 位并清零低 32 位。
在 java 中,要清除 long 类型变量的低 32 位(即保留高 32 位、置零低 32 位),最直接有效的方式是使用位运算符 & 配合一个合适的掩码(mask)。
为什么用 & 而不是其他运算符
& 是按位与运算,特点是:只有两个对应位都为 1 时结果才为 1,否则为 0。因此,只要构造一个“高 32 位全 1、低 32 位全 0”的掩码,再与目标 long 变量做 &,就能自然清零低 32 位,同时保留高 32 位不变。
正确的掩码写法
Java 中 long 是 64 位有符号整数。要让高 32 位为 1、低 32 位为 0,可写成:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
0xFFFFFFFF00000000L—— 十六进制字面量,末尾L表示 long 类型 - 或等价地:
0b1111111111111111111111111111111100000000000000000000000000000000L(二进制,不常用) - 也可通过位移构造:
0xFFFFFFFFL ,但注意必须先写成 <code>long字面量(加L),否则0xFFFFFFFF默认是int,值为 -1,左移 32 位会出错(Java 中 int 左移 32 位等价于不移)
实际代码示例
假设有一个 long 变量 value,想提取其高 32 位作为“高位特征”:
long value = 0x123456789ABCDEF0L; long high32 = value & 0xFFFFFFFF00000000L; // 结果:high32 == 0x1234567800000000L
若你还希望把这高 32 位“右对齐”变成一个干净的 int(即丢弃高位 0,只取有效 32 位数值),可以再右移 32 位:
-
int feature = (int)(value & 0xFFFFFFFF00000000L) >>> 32;(用无符号右移>>>更安全,避免符号扩展干扰) - 或更简洁:
int feature = (int)(value >>> 32);—— 因为>>> 32直接把低 32 位逻辑右移出去,高 32 位补 0,再强转int就自动截断高位,效果相同且更高效
常见误区提醒
- 别用
0xFFFFFFFF & value:这是对低 32 位取值,和目标相反 - 别漏写
L:如写0xFFFFFFFF00000000(无 L),Java 会尝试解析为 int,超出范围报错 - 别混淆
>>和>>>:若value为负数(高 32 位最高位是 1),用带符号右移>>会导致高位补 1,影响结果;>>>总是补 0,更符合“提取高位数值”的语义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










