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)
但是,我无法解压该号码。任何人都可以指导我做错什么吗?谢谢。
为了打包值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)