2

アプリのバージョン番号は 0x00870016 の形式で、最初の 4 桁の 16 進数がバージョン番号の最初の部分を表し、2 番目の 4 桁が 2 番目の部分を表すため、この例ではバージョン番号は 135.22 です。

(C++ で) これらの数値を個別に抽出して文字列として表示する方法を理解しようとしています。

4

2 に答える 2

9

マスクとシフトを組み合わせて使用​​すると、次のようになります。

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++ 標準では、右にシフトすると空いたビットに0s が入力されると規定されているためです。したがって、最終的なプログラムは次のようになります。

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";
}
于 2013-08-29T15:27:26.130 に答える