我正在尝试使用移位操作将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;
}
但是,我无法将号码拆开。 谁能指导我做错了什么? 谢谢。
答案 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个值。但是,您可以使用更大的类型(而不是长型)来容纳更多数字。