任意の長さの16進値を含む2つのstd ::文字列がある場合、2つの文字列と比較して値の大きい方を確認するにはどうすればよいですか?理想的には、私は大きな数のライブラリを使用する必要はありません。2つのC++ 16進文字列を比較する
私のような何かをしたいと思います:
if(hex1 > hex2)
{
//Do something
}
任意の長さの16進値を含む2つのstd ::文字列がある場合、2つの文字列と比較して値の大きい方を確認するにはどうすればよいですか?理想的には、私は大きな数のライブラリを使用する必要はありません。2つのC++ 16進文字列を比較する
私のような何かをしたいと思います:
if(hex1 > hex2)
{
//Do something
}
スタートを先行ゼロをトリミングすることによって。
同じ長さでない場合は、長い方が長くなります。
等しい長さの場合は、先頭からループして各桁を比較します。どちらの文字列でも、最初と同じ位置に大きな桁がある場合は、それより大きい文字列が最初に表示されます。 終了し、すべての数字が等しい場合、値は等しくなります。
コメントで既に言及されている2つの直近の問題を説明できませんでした –
先行ゼロが一杯になると、もっと長いものは必ずしも大きいものではありません – 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 ''よりも小さいと仮定しています。これは言語定義では必要ありません。 '' a ''から '' f ''までの文字は昇順の値としてエンコードされていると仮定していますが、これも言語定義では必要ありません。これらの仮定は、文字がASCIIでエンコードされている場合に有効ですが、そのような前提を答えに記述する必要があります。 –
@PeteBeckerが強化されました。 – Inline
:「0x0Dの」前に並べられます
配慮が本当の頭痛の種になります0X002Aは 『0x0Dを』の前に並べられます』)は0x0A」の前に並べられます』 。 C++ 11は、少なくとも64ビットの符号なし整数であるタイプunsigned long long int
を導入しました。これは、16進の16進数の文字を入力することができます。入力が長い場合は、これが機能しないため、文字列を解析する必要があります。
if(stoll(hex1, 0, 16) > stoll(hex2, 0, 16)
値は符号なしまたは符号付きですか? – lcs
std :: cin >> std :: hex >> hex1 >> hex2のような整数を16進整数として読み込み、それを通常と比較するために単純に整数として読み取ることができます。 –
文字列に[0-9]のみが含まれている場合、[a-f]または[A-F]は小文字(または大文字)にして、同じ長さであれば比較します。 –