2014-01-16 34 views
0

這是我的問題:我需要通過單個uint32_t傳回兩個uint32_t(因爲API的設置方式......)。我可以硬編碼任何其他值我需要扭轉操作,但參數之間傳遞的參數需要保留一個單一的uint32_t。在不更改數據類型的情況下可逆地組合兩個uint32_t

如果我可以將兩個32位整數轉換爲單個64位整型(如解釋here),這將是微不足道的,但編譯器不會那樣。我也看到數學pairing functions,但我不確定這是否是我需要在這種情況下。

我想過設置一個簡單的密碼:unint32_t可能是密文,我只能硬編碼密鑰。這是一個example,但這似乎是矯枉過正。

這甚至可能嗎?

+1

做些什麼範圍值的每個'uint32_t'需要代表?在某種極端情況下,他們是否需要40億的全部範圍,或者另一方面他們是否都代表布爾? – simonc

+0

在大多數情況下,數字將<1000。我不願意將兩者的低位轉換爲單個uint32_t,但這在短期內會起作用。 – Chance

回答

2

根據多少麻煩,這是很值得,你可以:

  1. 創建的std::pair<uint32_t,uint32_t>
  2. 一個全局數組或vector傳遞一個索引的功能,那麼你的「反向」功能只是查找數組中的結果。
  3. 編寫一些代碼來決定當你有一對通過時使用哪個索引。該索引不需要被其他人使用,並且由於該數組是全局的,因此可能存在線程安全問題。基本上你正在寫的是一個簡單的內存分配器。

作爲一個特殊的情況下,具有32個數據指針的機器上,你可以分配struct和reinterpret_cast指針和從uint32_t。所以你不需要任何全局變量。

請注意,您需要知道您傳遞值的函數是否可能將值稍後存儲在某個地方進行「解碼」,在這種情況下,您的資源管理問題比功能確定在它返回時完成使用它。

在簡單的情況下,如果您正在編寫的代碼根本不需要重入,那麼您只需一次使用一個索引。這意味着你不需要一個數組,只需要一個pair。無論數值如何,您都可以將0傳遞給函數,並讓解碼器忽略其輸入並查看全局位置。

如果兩種特殊情況都適用(32位且不保留該值),則可以將pair放在堆棧上,即使您的代碼確實需要重新進入也不使用全局變量和動態分配。

這些都不是真正的建議,但它可以解決你的問題。

3

僅使用32位就不可能存儲超過32位的信息。這是信息論的基本結果。

如果您知道您只使用每個值的低位16位,則可以將一個左邊的16位進行移位並將它們組合在一起。但絕對沒有辦法將64位的信息(甚至33位)轉換爲32位的週期。

+0

正確,但它不是簡單的32位。作爲一個參數必須傳遞的是32位,但是我有其他需要在接收函數中呈現的數據。 – Chance

+0

@Chance我不明白這很重要。只有32位信息正在從功能傳送給呼叫者。在不改變返回類型的情況下(或者使用全局變量或傳遞函數可以存儲信息的參數),你無法繞過這一點。 – TypeIA

1

您可以使用一箇中間全局數據結構存儲對uint32_t就可以了,用你只uint32_t參數作爲結構上的指數:

struct my_pair { 
    uint32_t a, b; 
}; 

std::map<uint32_t, my_pair> global_pair_map; 

uint32_t register_new_pair(uint32_t a, uint32_t b) { 
    // Add the pair of (a, b) to the map global_pair_map on a new key, and return the 
    // new key value. 
} 

void release_pair(uint32_t key) { 
    // Remove the key from the global_pair_map. 
} 

void callback(uint32_t user_data) { 
    my_pair& p = global_pair_map[user_data]; 

    // Use your pair of uint32_t with p.a, and p.b. 
} 

void main() { 
    uint32_t key = register_new_pair(number1, number2); 

    register_callback(callback, key); 
} 
相關問題