2016-06-29 14 views
0

Wenn ich zwei Std :: Strings habe, die einen Hexadezimalwert beliebiger Länge enthalten, wie kann ich mit den beiden vergleichen, um zu sehen, welche in Bezug auf Wert größer ist? Idealerweise möchte ich vermeiden, eine große Nummernbibliothek verwenden zu müssen.Vergleicht man zwei C++ Hexadezimalzeichenfolgen

Ich möchte etwas tun:

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

Sind die Werte unsigned oder signed? – lcs

+0

Sie könnten sie einfach als ganze Zahl wie folgt lesen: std :: cin >> std :: hex >> hex1 >> hex2, um sie als hexadezimale Ganzzahlen zu lesen und sie dann normal zu vergleichen. –

+0

Wenn die Strings nur [0-9] enthalten, machen [a-f] oder [A-F] sie zu Kleinbuchstaben (oder Großbuchstaben) und vergleichen sie wie Sie (wenn sie die gleiche Länge haben). –

Antwort

0

Beginnen Sie mit führenden Nullen trimmen.

Wenn sie nicht gleich lang sind, dann ist die längere größer.

Wenn sie gleich lang sind, durchlaufen Sie sie von Anfang an und vergleichen Sie jede Ziffer. Der erste String hat eine größere Ziffer an der gleichen Stelle wie der andere. Wenn Sie bis zum Ende kommen und alle Ziffern gleich sind, dann sind die Werte gleich.

+0

Sie konnten zwei unmittelbare Probleme nicht berücksichtigen, die bereits in den Kommentaren erwähnt wurden –

+1

Die längere darf nicht unbedingt größer sein, wenn sie eine ganze Reihe von führenden Nullen enthält – cup

0

Wenn Sie std::string verwenden. Funktioniert für ASCII-Codierung.

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

Vergleich auf Größe kann falsch sein, im Falle von führenden 0s. –

+0

Dieser Code geht davon aus, dass "9" kleiner ist als "a", was für die Sprachdefinition nicht erforderlich ist. Es wird auch angenommen, dass die Zeichen "a" bis "f" als aufsteigende Werte codiert sind, was auch von der Sprachdefinition nicht benötigt wird. Diese Annahmen sind gültig, wenn die Zeichen in ASCII codiert sind, aber eine solche Annahme muss in der Antwort angegeben werden. –

+0

@PeteBecker erweitert. – Inline

2

Sie können auf diesen Zahlen String-Vergleich zu tun, aber es gibt mehrere potenzielle Probleme, die für sein müssten berücksichtigt:

  1. Ein Zeichen-Zeichen („+ 0x2A“ wird vor „0X0D“ bestellt werden)
  2. die Existenz eines "0X" ("0x2A" wird vor "0D")
  3. die Aktivierung des "0X" ("0x2A" vor "0x0D")
  4. die Kapitalisierung bestellt bestellt werden Hexadezimalziffern ("0X0 D 0x0A“wird vor bestellt werden‚‘)
  5. Die Null-Auffüllung von Zahlen (‚0X002A 0X0D‘wird vor bestellt werden‚‘)

Prüfung für all diese Bedingungen und ihre möglichen Kombinationen wird ein echten Kopfschmerzen . C++ 11 führte den Typ unsigned long long int ein, der mindestens eine 64-Bit-Ganzzahl ohne Vorzeichen ist. Das gibt Ihnen eine satte 16 Hex-Zeichen der Eingabe, wenn Ihre Eingabe länger als das ist, wird dies nicht funktionieren, und Sie müssen die Zeichenfolge analysieren.

Verwandte Themen