C# 将 5 个整数打包成 1 个

Cee*_*our 0 c# integer bit pack

我正在尝试使用位移操作将 5 个整数(每个最多 999 个)打包和解压缩为一个唯一的整数:

static UInt64 Combine(uint a, uint b, uint c, uint d, uint e)
    {
        return (a << 48) | (b << 32 ) | (c << 16) | (d << 8) | e;
    }
Run Code Online (Sandbox Code Playgroud)

但是,我无法解压该号码。任何人都可以指导我做错什么吗?谢谢。

pax*_*blo 5

为了打包值0..999,您需要位,而不是八位。十会给你值,0..1023而八只会给你0..255

所以你需要的功能是这样的:

static UInt64 Combine(
    uint a, uint b, uint c, uint d, uint e
) {
    UInt64 retval = a;
    retval = (retval << 10) | b;
    retval = (retval << 10) | c;
    retval = (retval << 10) | d;
    retval = (retval << 10) | e;
    return retval;
}
Run Code Online (Sandbox Code Playgroud)

然后,要解压缩它们,只需提取每组十位,一次一个,例如:

static void Extract(UInt64 val, out uint a, out uint b,
    out uint c, out uint d, out uint e
) {
    e = Convert.ToUInt32(val & 0x3ff); val = val >> 10;
    d = Convert.ToUInt32(val & 0x3ff); val = val >> 10;
    c = Convert.ToUInt32(val & 0x3ff); val = val >> 10;
    b = Convert.ToUInt32(val & 0x3ff); val = val >> 10;
    a = Convert.ToUInt32(val & 0x3ff);
}
Run Code Online (Sandbox Code Playgroud)