在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
相关产品推荐
相关产品推荐

