2013-11-15 169 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個位置,並從原始整數中減去。

相關問題