繁体   English   中英

将4个整数装入ulong的更好方法是什么?

[英]What is a better way to pack 4 ints into ulong?

我需要将多个int值(每个值仅介于0到999之间)打包到ulong中。 我有如下工作方法,但是可以对其进行优化吗?

我知道它会伤害您的眼睛,很多0表示抱歉。

public class Test  {

    public void Start() {
        ulong testValue = 444333222111;

        Debug.Log(GetValue1(testValue) + " " + GetValue2(testValue) + " " + GetValue3(testValue) + " " + GetValue4(testValue)); // = 111 222 333 444

        SetValue1(ref testValue, 55);
        SetValue2(ref testValue, 9);
        SetValue3(ref testValue, 111);
        SetValue4(ref testValue, 999);

        Debug.Log(testValue); // = 999111009055
        Debug.Log(GetValue1(testValue) + " " + GetValue2(testValue) + " " + GetValue3(testValue) + " " + GetValue4(testValue)); // = 55 9 111 999
    }

    public int GetValue1(ulong i) => (int)(i % 1000);
    public void SetValue1(ref ulong i, int value) => i = i / 1000 * 1000 + (ulong)value;

    public int GetValue2(ulong i) => (int)(i % 1000000 / 1000);
    public void SetValue2(ref ulong i, int value) => i = i / 1000000 * 1000000 + (ulong)value * 1000 + i % 1000;

    public int GetValue3(ulong i) => (int)(i % 1000000000 / 1000000);
    public void SetValue3(ref ulong i, int value) => i = i / 1000000000 * 1000000000 + (ulong)value * 1000000 + i % 1000000;

    public int GetValue4(ulong i) => (int)(i % 1000000000000 / 1000000000);
    public void SetValue4(ref ulong i, int value) => i = i / 1000000000000 * 1000000000000 + (ulong)value * 1000000000 + i % 1000000000;

}

干得好。 首先创建一个[StructLayout(LayoutKind.Explicit)]结构,如下所示:

[StructLayout(LayoutKind.Explicit)]
public struct FourWords
{
    [FieldOffset(0)] public ulong Whole;
    [FieldOffset(0)] public ushort First;
    [FieldOffset(2)] public ushort Second;
    [FieldOffset(4)] public ushort Third;
    [FieldOffset(6)] public ushort Fourth;
}

然后,您可以按预期访问每个“第一”,“第二” ...字段:

 FourWords test = new FourWords();
 test.Second = 0x101;
 test.Fourth = 0xA0A;
 var xyz = test.Whole;

如果在调试器中查看xyz(在十六进制视图中),则会看到:

    xyz, h  0x0a0a000001010000  ulong

您会看到101和A0A。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM