шаблонное целое число неизвестного размера - PullRequest
2 голосов
/ 24 мая 2011

Как бы я преобразовал двоичную / шестнадцатеричную строку в целое число, учитывая, что я не знаю, насколько большой будет строка?

Я хочу, чтобы atoi / atol делал, ноЯ не знаю, что выводить, потому что я не знаю, будет ли значение 32-битным или 64-битным.Кроме того, atoi не выполняет шестнадцатеричное, поэтому 101 станет 101, а не 0x101==257.

Я предполагаю, что мне нужно использовать template<typename T>, но как мне создать переменную длявывод в функцию?T varname может быть чем угодно, так что же делает varname числом, а не указателем, указывающим на какое-то случайное место?

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Шаблоны время компиляции вещь. Вы не можете выбрать тип данных во время выполнения. Если ваши входные значения не будут превышать диапазон 64-битного типа, просто используйте 64-битный тип.

Один из способов (но ни в коем случае не единственный) сделать преобразование заключается в следующем:

template <typename T>
T hex_to_int(const std::string &str)
{
    T x;
    std::stringstream(str) >> std::hex >> x;
    return x;
}

std::string str = "DEADBEEF";  // hex string
uint64_t x = hex_to_int<uint64_t>(str);
std::cout << x << std::endl;  // "3735928559"
2 голосов
/ 24 мая 2011

вам просто нужно определить класс bigInt и затем проанализировать вашу строку в этом классе; что-то вроде этого класса: https://mattmccutchen.net/bigint/

0 голосов
/ 24 мая 2011

Может быть, что-то вроде непроверенного это:

int  // or int64 or whatever you decide on
hexstr2bin ( char *s ) {  // *s must be upper case
int result = 0;     // same type as the type of the function
  while ( *char ) {
    result <<= 16;
    if ( *char ) <= '9' {
      result += *char & 0xF;
    }
    else {
      result = ( *char & 0xF ) + 9;
    }
  }
  return result;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...