如果我有兩個包含任意長度的十六進制值的std :: strings,我怎麼能比較兩者來看哪一個更大的值?理想情況下,我想避免使用大號碼庫。比較兩個C++十六進制字符串
我想這樣做:
if(hex1 > hex2)
{
//Do something
}
如果我有兩個包含任意長度的十六進制值的std :: strings,我怎麼能比較兩者來看哪一個更大的值?理想情況下,我想避免使用大號碼庫。比較兩個C++十六進制字符串
我想這樣做:
if(hex1 > hex2)
{
//Do something
}
開始通過修剪前導零。
如果它們的長度不相等,那麼長度越大。
如果它們長度相等,則從頭開始循環並比較每個數字。無論哪個字符串首先在相同的位置有一個更大的數字更大。 如果您到達最後並且所有數字都相等,則值相等。
你沒有考慮到已經在評論中提到的兩個直接問題 –
如果它有一大堆前導零,則長度可能不會更長 – cup
如果您使用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的情況下,大小的比較可能是錯誤的。 –
該代碼假定「9」小於「a」,這不是語言定義所要求的。它還假定通過「f」的字符「a」被編碼爲升序值,這也不是語言定義所要求的。如果字符以ASCII編碼,那麼這些假設是有效的,但是這樣的假設必須在答案中說明。 –
@PeteBecker增強。 – Inline
你能做到這些數字串的比較,但也有其必須被考慮的幾個潛在的問題:
考慮所有這些條件,他們的潛力組合’將之前訂購’將是一個真正的頭痛」,將之前預訂’ 。 C++ 11引入了至少一個64位無符號整數的類型unsigned long long int
。這給你一個高達16個十六進制字符值得輸入,如果你的輸入比這更長,這將不起作用,你將不得不分析字符串。
if(stoll(hex1, 0, 16) > stoll(hex2, 0, 16)
值是無符號的還是帶符號的? – lcs
你可以簡單地把它們讀成像這樣的整數:std :: cin >> std :: hex >> hex1 >> hex2以讀取它們爲十六進制整數,然後正常比較它們。 –
如果字符串只包含[0-9],[a-f]或[A-F]使它們成爲小寫(或大寫),並且與您做比較(如果它們具有相同的長度)。 –