You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中如何提取UInt128类型包含的两个UInt64值?

提取UInt128的高低位UInt64值

假设我们有以下UInt128实例:

UInt64 upperA = 7, lowerA = 8;
UInt128 foo = new(upperA, lowerA);
++foo;

现在需要从更新后的foo里取出两个UInt64值,但UInt128并没有自带Upper和Lower属性,你可以用下面两种常用方法实现:

方法一:位运算提取

用位掩码和右移操作直接拆分高低位:

// 提取低64位,直接强制转换即可
UInt64 lowerB = (UInt64)foo;
// 提取高64位:先右移64位,再转成UInt64
UInt64 upperB = (UInt64)(foo >> 64);

原理很简单:UInt128的低64位刚好对应UInt64的取值范围,强制转换就能拿到;高64位则通过右移64位,把原本的高位部分移到低64位区域,再转成UInt64就行。

方法二:内存映射提取(无需unsafe代码)

通过MemoryMarshal.Cast把UInt128的内存直接映射成UInt64的Span,直接访问对应位置的元素:

Span<UInt128> fooSpan = stackalloc UInt128[] { foo };
Span<UInt64> uint64Span = MemoryMarshal.Cast<UInt128, UInt64>(fooSpan);

UInt64 lowerB = uint64Span[0];
UInt64 upperB = uint64Span[1];

注意:这种方法依赖.NET中UInt128的内存布局(小端序,低字节在前),而官方实现的UInt128符合这个布局,所以可以放心用。

内容的提问来源于stack exchange,提问作者Hal Heinrich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:50:34