最直接有效的方式是使用按位与运算符 & 配合掩码 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,可写成:
-
0xFFFFFFFF00000000L—— 十六进制字面量,末尾L表示 long 类型 - 或等价地:
0b1111111111111111111111111111111100000000000000000000000000000000L(二进制,不常用) - 也可通过位移构造:
0xFFFFFFFFL << 32,但注意必须先写成long字面量(加L),否则0xFFFFFFFF默认是int,值为 -1,左移 32 位会出错(Java 中 int 左移 32 位等价于不移)
实际代码示例
假设有一个 long 变量 value,想提取其高 32 位作为“高位特征”:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
long value = 0x123456789ABCDEF0L; long high32 = value & 0xFFFFFFFF00000000L; // 结果:high32 == 0x1234567800000000L
若你还希望把这高 32 位“右对齐”变成一个干净的 int(即丢弃高位 0,只取有效 32 位数值),可以再右移 32 位:
立即学习“Java免费学习笔记(深入)”;
-
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,更符合“提取高位数值”的语义

















