c# - 将 3 个字节 Span 转换为 int 的正确方法
问题描述
我知道,我可以Span
通过分别转换每个字节并组合成一个整数来将 3 个字节转换为字节数组。我还可以将 1 字节数组与从类转换Span
并使用的 3 字节数组连接起来BitConverter
。这些方法很古老而且众所周知,但我正在考虑是否有更好的方法来做到这一点,尤其是在Span
像这样使用时:mySpan.Slice(10, 3)
.
解决方案
问题是 3 字节是一个非常尴尬的数字,因为没有可用的 3 字节寄存器大小。一种方法是将其拆分为 2 个字节和 1 个字节,并将|
它们放在一起:
var arr = new byte[] { 5, 20, 10 };
var span = arr.AsSpan();
var val = MemoryMarshal.Cast<byte, ushort>(span.Slice(1))[0] << 16 | (span[0] << 8);
JIT 生成的汇编代码只是像预期的那样直接复制 ( lea
) 和移位 ( shr
),只是 C# 语法有点笨拙。
推荐阅读
- jquery - 对带有 span 元素的键盘的辅助功能支持
- javascript - 使用 Javascript 在文档之间切换?
- excel - 粘贴在outlook邮件正文上的图片不显示
- python - 从 __future__ 导入注释
- ibm-cloud - 启动仪表板 Cloudant 失败
- wpf - WPF中,如何在ScrollViewer中自定义ScrollBar的样式
- python - python比较两个不同格式的日期字符串
- r - 使用前一行的结果以特定的数字顺序进行变异
- c++ - 如何在类中获取静态变量
- python - 使用 Cython 为 ac 库编译包装器 - 链接器在 OSX 上找不到外部 c 库的 .dylib