用位移和按位或将两个short无损合并为long:shortA左移48位置于高16位,shortB置低16位,中间32位补0;拆分时用掩码0xFFFF提取低位,高位右移48后强转。

用位运算把两个 short 合并成一个 long,核心是“分段放置 + 无损拼接”。关键不在加法,而在位移和按位或(|),这样能清晰表达各部分在最终结果中的位置,避免符号扩展或溢出干扰。
明确数据布局与位宽分配
一个 short 是 16 位有符号整数,long(以 C# 或 Java 的 64 位 long 为例)是 64 位。合并两个 short 时,常见做法是:
- 把第一个
short放在高位(比如第 48–63 位) - 把第二个
short放在低位(比如第 0–15 位) - 中间 32 位可留空(全 0),或根据需要填入其他字段
合并操作:左移 + 按位或
假设 shortA 和 shortB 是待合并的两个 16 位值:
- 将
shortA强转为long,再左移 48 位 → 占据高 16 位 - 将
shortB强转为long(不移位)→ 占据低 16 位 - 用
|运算连接两者:result = ((long)shortA - 不用
+是因为|更语义准确:两段互不重叠,或运算等价于加法,且更安全(无进位风险)
拆分还原:右移 + 掩码
从合并后的 long 中提取原始 short 值:
- 取高位
shortA:右移 48 位后强转为short→(short)(result >> 48) - 取低位
shortB:与掩码0xFFFF(即十六进制的 65535,二进制 16 个 1)做与运算,再强转 →(short)(result & 0xFFFF) - 掩码确保只保留低 16 位,防止符号位污染(尤其当
result是负数时)
注意事项与避坑点
实际编码中容易出错的地方:
- 必须先转
long再移位,否则在 32 位环境或整型提升过程中可能截断(如直接对short左移 48 会先提升为int,导致高位丢失) -
short是有符号类型,但作为“数据容器”使用时,建议按无符号逻辑处理;必要时可用(ushort)或& 0xFFFF清除符号扩展影响 - 不同语言默认
long位宽不同(Java/C# 是 64 位,C/C++ 中long可能是 32 位),务必确认目标平台 - 若需跨平台或网络传输,还需考虑字节序(大端/小端),但纯内存内位运算不受影响










