Функция C ++ с использованием своего рода побитового: я получу дублированные значения? - PullRequest
4 голосов
/ 10 ноября 2010

это моя функция C ++, которая использует побитовый вид:

int genkey(const unsigned char a,const char b,const char c )
{
    int val=0;
    unsigned char *p= reinterpret_cast <unsigned char *>(&val);
    p[0]=a;
    char *q= reinterpret_cast <char *>(&val);
    q[1]=b;
    q[2]=c;
    return val;
}

Я использую это для генерации ключей (уникальное значение для объекта).

Диапазон значений, которые можно передать в функцию: для параметра => [0..255], для параметра b => [0..127] и для параметра c => [0 .. 127].

Предположим, что функция может быть вызвана только один раз с одинаковыми значениями трех аргументов. Например, будет только один вызов со значениями (10, 0, 0).

Возвращает ли функция дублированные значения?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 10 ноября 2010

Ваша функция, вероятно, возвращает уникальные значения для каждого уникального набора входных значений (при условии, что ваша int имеет ширину не менее 24 бит). Тем не менее, лучший способ написать это может быть:

int genkey(const unsigned char a,const char b,const char c )
{
    return a
         | (static_cast<unsigned char>(b) << 8)
         | (static_cast<unsigned char>(c) << 16);
}

Это объединяет три 8-битных значения в одно 24-битное значение без использования трудно читаемых манипуляций с указателями.

Обратите внимание, что я позаботился о приведении значений char (которые могут быть signed char в зависимости от настроек вашего компилятора) в unsigned char перед их сдвигом. Причина в том, что смещение сначала повысит значение до int со знаком, что может включать расширение знака. Вы этого не захотите.

1 голос
/ 10 ноября 2010

Ваш код даст разные результаты на разных архитектурах. Может быть, это не имеет значения, конечно.

Это переносной эквивалент:

return ((((int) a << 8) + b) << 8) + c;

Или это:

return ((((int) a * 256) + b) * 256) + c;
0 голосов
/ 10 ноября 2010

На любой разумной машине, которую я могу придумать для уникальных входных значений, получится уникальный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...