Вот моя проблема: мне нужно передать обратно два uint32_t через один uint32_t (из-за того, как настроен API …). Я могу жестко запрограммировать любые другие значения, которые мне нужны, чтобы полностью изменить операцию, но параметр, передаваемый между функциями, должен оставаться единственным uint32_t.
Это было бы тривиально, если бы я мог просто сдвинуть бит 32-битных целых в одно 64-битное целое (как объяснено выше) Вот), но компилятору это не понравится. Я также видел математические функции сопряжения, но я не уверен, что это то, что мне нужно в этом случае.
Я думал о настройке простого шифра: unint32_t мог бы быть текстом шифра, и я мог просто жестко закодировать ключ. Это пример, но это кажется излишним.
Это вообще возможно?
В зависимости от того, сколько проблем это действительно стоит, вы можете:
vector
из std::pair<uint32_t,uint32_t>
В особом случае на машине с 32-битными указателями данных вы можете выделить структуру и reinterpret_cast
указатель на и от uint32_t
, Так что вам не нужны глобалы.
Имейте в виду, что вам нужно знать, может ли функция, в которую вы передаете значение, сохранить значение где-то, чтобы потом его «декодировать», и в этом случае у вас возникает более сложная проблема управления ресурсами, чем если бы функция наверняка закончила использовать это к тому времени, как это возвращается.
В простом случае, и если код, который вы пишете, вообще не нуждается в повторном вводе, вам нужно использовать только один индекс за раз. Это означает, что вам не нужен массив, только один pair
, Вы могли бы пройти 0
к функции независимо от значений, и пусть декодер игнорирует свой ввод и смотрит в глобальное местоположение.
Если применимы оба особых случая (32-битное значение без сохранения значения), вы можете поместить pair
в стеке, и не используйте глобальные переменные и динамическое распределение, даже если ваш код нуждается в повторном входе.
Ничего из этого не рекомендуется, но это может решить вашу проблему.
Невозможно хранить более 32 бит информации, используя только 32 бита. Это основной результат теории информации.
Если вы знаете, что используете только младшие 16 битов каждого значения, вы можете сместить один левый 16 бит и объединить их таким образом. Но нет абсолютно никакого способа получить 64-битную информацию (или даже 33-битную) в 32-битную точку.
Вы можете использовать промежуточную глобальную структуру данных для хранения пары 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);
}