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

时间:2018-08-12 03:35:17

标签: 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;
    }

但是,我无法将号码拆开。 谁能指导我做错了什么? 谢谢。

2 个答案:

答案 0 :(得分:4)

要打包值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;
}

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

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);
}

答案 1 :(得分:0)

另一种存储数字的方式。有点不同。但是,我想我会把它呈现给您。基本上,我们只是在模仿“联盟”:

print (df)
  entry_name  entry_id  052018 info_1  062018 info_2  052018 other_1  \
0          a         1              0              0               1   
1          b         2              0              1               0   
2          c         4              0              0               0   
3          d         5              2              3               4   

   062018 other_2  
0               2  
1               0  
2               0  
3               4  

df1 = df.filter(like='info').copy()
df1[np.nan] = 1
df['info'] = df1.ne(0).idxmax(axis=1)

df2 = df.filter(like='other').copy()
df2[np.nan] = 1
df['other'] = df2.ne(0).idxmax(axis=1)
print (df)
  entry_name  entry_id  052018 info_1  062018 info_2  052018 other_1  \
0          a         1              0              0               1   
1          b         2              0              1               0   
2          c         4              0              0               0   
3          d         5              2              3               4   

   062018 other_2           info           other  
0               2            NaN  052018 other_1  
1               0  062018 info_2             NaN  
2               0            NaN             NaN  
3               4  052018 info_1  052018 other_1  

此结构仅存储4个值。但是,您可以使用更大的类型(而不是长型)来容纳更多数字。