2016-06-29 48 views
0

如果我有兩個包含任意長度的十六進制值的std :: strings,我怎麼能比較兩者來看哪一個更大的值?理想情況下,我想避免使用大號碼庫。比較兩個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」,這不是語言定義所要求的。它還假定通過「f」的字符「a」被編碼爲升序值,這也不是語言定義所要求的。如果字符以ASCII編碼,那麼這些假設是有效的,但是這樣的假設必須在答案中說明。 –

+0

@PeteBecker增強。 – Inline

2

你能做到這些數字串的比較,但也有其必須被考慮的幾個潛在的問題:

  1. 符號字符(「+ 0X2A」「0X0D」之前,將被責令)
  2. 一個 「0X」( 「0X2A」 的存在會
  3. 的 「0X」( 「0X2A」 的大寫將 「0X0D」)
  4. 資本化之前預訂 「0D」)之前預訂的十六進制數字(「0X0 d 0X0A‘)
  5. 零填充數字(‘0X002A 0X0D‘)

考慮所有這些條件,他們的潛力組合’將之前訂購’將是一個真正的頭痛」,將之前預訂’ 。 C++ 11引入了至少一個64位無符號整數的類型unsigned long long int。這給你一個高達16個十六進制字符值得輸入,如果你的輸入比這更長,這將不起作用,你將不得不分析字符串。

if(stoll(hex1, 0, 16) > stoll(hex2, 0, 16) 
相關問題