2016-06-29 2 views
0

Если у меня есть две std :: строки, которые содержат шестнадцатеричное значение произвольной длины, как я могу сравнить их с двумя, чтобы увидеть, какой из них больше по стоимости? В идеале я бы хотел не использовать большую библиотеку.Сравнение двух шестнадцатеричных строк C++

Я хотел бы сделать что-то вроде:

if(hex1 > hex2) 
{ 
    //Do something 
} 
+1

Являются ли значения без знака или подписанными? – lcs

+0

Вы можете просто прочитать их как целое: std :: cin >> std :: hex >> hex1 >> hex2, чтобы читать их как шестнадцатеричные целые числа, а затем сравнивать их нормально. –

+0

Если строки содержат только [0-9], [a-f] или [A-F] делают их в нижнем регистре (или в верхнем регистре) и сравниваются так же, как и вы (если они имеют одинаковую длину). –

ответ

0

Пуска обрезки ведущих нулей.

Если они не равны по длине, то чем длиннее, тем больше.

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

+0

вам не удалось объяснить две проблемы, которые уже упоминались в комментариях –

+1

. Чем длиннее, тем больше может быть не больше, если у него есть целая куча ведущих нулей. – cup

0

Если вы используете std::string. Работает для кодирования ASCII.

bool hex_greater(std::string &first, std::string &second) 
{ 
    /* Comprasions based on size */ 
    int firstSize = first.size(); 
    int secondSize = second.size(); 
    if(firstSize > secondSize) 
     return true; 
    else if(firstSize < secondSize) 
     return false; 

    /* Convert to lower case, for case insentitive comprasion */ 
    std::transform(first.begin(), first.end(), first.begin(), ::tolower); 
    std::transform(second.begin(), second.end(), second.begin(), ::tolower); 

    /* Call the std::string operator>(...) which compare strings lexicographically */ 
    if(first > second) 
     return true; 

    /* In other cases first hex string is not greater */ 
    return false; 
} 
+0

. Сравнение по размеру может быть ложным, в случае ведущих 0. –

+0

Этот код предполагает, что '' 9'' меньше, чем '' a'', что не требуется в определении языка. Он также предполагает, что символы '' a'' через ''f'' кодируются как восходящие значения, что также не требуется в определении языка. Эти допущения действительны, если символы кодируются в ASCII, но такое предположение должно быть указано в ответе. –

+0

@PeteBecker расширен. – Inline

2

Вы можете сделать сравнение строк на эти числа, но есть несколько потенциальных проблем, которые должны были бы быть учтены:

  1. сигнальным знаком символа («+ 0x2A» будет заказано до «0x0D»)
  2. существование «0x» («0x2a» будут заказаны до «0D»)
  3. капитализация «0x» («0x2a» будут заказаны до «0x0D»)
  4. капитализация шестнадцатеричных цифр ("0X0 D»будет заказан до„0x0A“)
  5. Нулевой обивки чисел („0X002A“будет заказан до„0x0D“)

Рассмотрения всех этих условий и их возможных комбинаций будет настоящей головной болью , В C++ 11 был введен тип unsigned long long int, который представляет собой по меньшей мере 64-разрядное целое число без знака. Это дает вам колоссальные 16 шестнадцатеричных символов ввода, если ваш вход длиннее, чем это не будет работать, и вам придется разбирать строку.

if(stoll(hex1, 0, 16) > stoll(hex2, 0, 16) 
Смежные вопросы