アプリのバージョン番号は 0x00870016 の形式で、最初の 4 桁の 16 進数がバージョン番号の最初の部分を表し、2 番目の 4 桁が 2 番目の部分を表すため、この例ではバージョン番号は 135.22 です。
(C++ で) これらの数値を個別に抽出して文字列として表示する方法を理解しようとしています。
アプリのバージョン番号は 0x00870016 の形式で、最初の 4 桁の 16 進数がバージョン番号の最初の部分を表し、2 番目の 4 桁が 2 番目の部分を表すため、この例ではバージョン番号は 135.22 です。
(C++ で) これらの数値を個別に抽出して文字列として表示する方法を理解しようとしています。
マスクとシフトを組み合わせて使用すると、次のようになります。
int main()
{
const uint32_t v = 0x00870016;
const uint16_t major = (v & 0xFFFF0000) >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}
出力:
135.22
説明:
0x00870016
は 32 ビットの数値です。メジャー バージョン番号は最上位 16 桁で構成され、マイナー バージョン番号は最下位 16 桁です。
メジャー バージョン番号を抽出するために、入力値を次のようにマスクして 16 MSBits であることを確認しましょう0xFFFF0000
。最上位 16 桁すべてが に設定され、最下位1
ビットがすべて0
:
0x00870016 && 0xFFFF0000 = 0x00870000
結果の値は、16 ビット左にシフトされたメジャー バージョン番号です。それでは、それをシフトしましょう:
0x00870000 >> 16 = 0x00000087
そして、実際のメジャー バージョン番号が表示されます。
マイナー バージョン番号の抽出も同様ですが、シフトする必要はありません。
ノート:
最初のステップは、マスクをスキップすることで簡素化できます。
const uint16_t major = v >> 16;
これが機能するのは、C++ 標準では、右にシフトすると空いたビットに0
s が入力されると規定されているためです。したがって、最終的なプログラムは次のようになります。
int main()
{
const uint32_t v = 0x00870016;
const uint16_t major = v >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}
編集:
コメントに記載されているように0x00870016
、数値ではなく文字列として取得している可能性があります。この文字列を対応する数値に変換するだけです。先頭に対処すること0x
はつまずきのように思えるかもしれませんが、C++ 標準ライブラリの iostream マニピュレーターを使用する場合はそうではありません。
int main()
{
const std::string inVer = "0x00870016";
uint32_t v = 0;
std::stringstream ss;
ss << inVer;
ss >> std::hex >> v;
const uint16_t major = v >> 16;
const uint16_t minor = v & 0x0000FFFF;
cout << major << "." << minor << "\n";
}