我有以下問題:我有一個整數元組列表,我必須將其存儲爲整數(即(1,1) - > 1,(2,1) - > 2 ,(1,2) - > 3等)。我必須從整數值中取回元組值,因此散列函數會丟失信息,因此無法使用。有沒有其他快速功能可以做到這一點,還是我必須自己做這件事?將int-tuples轉換爲int並返回
非常感謝!
我有以下問題:我有一個整數元組列表,我必須將其存儲爲整數(即(1,1) - > 1,(2,1) - > 2 ,(1,2) - > 3等)。我必須從整數值中取回元組值,因此散列函數會丟失信息,因此無法使用。有沒有其他快速功能可以做到這一點,還是我必須自己做這件事?將int-tuples轉換爲int並返回
非常感謝!
這很簡單:
__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)
注意:應該使用* unsigned * int64來避免UB(除非知道這些值總是非負的)。 –
@OliCharlesworth肯定,但是他說他使用'__int64'。更好的類型是'unsigned __int64',對。哦,是的,我明白了。 – Neet
@OliCharlesworth:我的數值總是等於或大於零,這樣我就可以使用'__int64' –
您可以將兩個整數合併爲一個__int64整數,方法是首先將它們轉換/轉換爲__int64,然後將它們中的一個位移到32位並添加它們。
解碼只是做相反的事情 - 複製長整數,然後向左移動32個位置,並從原始整數中減去。
這是不可能的。如果您的輸入整數有2^N個可能的值,那麼將會有2 ^(2N)個可能的元組值。所以你需要一個更大的整數類型來存儲結果(在這種情況下,串聯對於你的問題來說是一個簡單的解決方案)。 –
@Oli Charlesworth:如果我加上他們,我怎麼能再把它們分開呢?關於空間問題:沒有問題,因爲對於使用「int」的元組和我使用「__int64」的「整數」值。 –
不要添加它們,連接它們。即使用位移(您需要首先轉換爲無符號,以避免未定義的行爲)。 –