2013-11-15 124 views
0

我有以下问题:我有一个整数元组列表,我必须将其存储为整数(即​​(1,1) - > 1,(2,1) - > 2 ,(1,2) - > 3等)。我必须从整数值中取回元组值,因此散列函数会丢失信息,因此无法使用。有没有其他快速功能可以做到这一点,还是我必须自己做这件事?将int-tuples转换为int并返回

非常感谢!

+1

这是不可能的。如果您的输入整数有2^N个可能的值,那么将会有2 ^(2N)个可能的元组值。所以你需要一个更大的整数类型来存储结果(在这种情况下,串联对于你的问题来说是一个简单的解决方案)。 –

+0

@Oli Charlesworth:如果我加上他们,我怎么能再把它们分开呢?关于空间问题:没有问题,因为对于使用“int”的元组和我使用“__int64”的“整数”值。 –

+0

不要添加它们,连接它们。即使用位移(您需要首先转换为无符号,以避免未定义的行为)。 –

回答

1

这很简单:

__int64 v = ((__int64)first << 32) | ((__int64)second & 0xffffffffL) 

和:

int first = (int)((v >> 32) & 0xffffffffL) 
int second = (int)(v & 0xffffffffL) 

或(使用无符号的存储类型):

uint64_t v = ((uint64_t)first << 32) | (uint64_t)second 

和:

int first = (int)(v >> 32) 
int second = (int)(v & 0xffffffffL) 
+0

注意:应该使用* unsigned * int64来避免UB(除非知道这些值总是非负的)。 –

+0

@OliCharlesworth肯定,但是他说他使用'__int64'。更好的类型是'unsigned __int64',对。哦,是的,我明白了。 – Neet

+0

@OliCharlesworth:我的数值总是等于或大于零,这样我就可以使用'__int64' –

1

您可以将两个整数合并为一个__int64整数,方法是首先将它们转换/转换为__int64,然后将它们中的一个位移到32位并添加它们。

解码只是做相反的事情 - 复制长整数,然后向左移动32个位置,并从原始整数中减去。

相关问题