2

私はこのコードを持っています:

char digits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
    'C', 'D', 'E', 'F' };
string toFormatFromDecimal(long long t, Format format) {
    int digitCount = ceil(log(t) / log((int) format));
    string hex = "";
    for (int i = 0; i < digitCount; i++) {
        hex += digits[(int) (t%format)];
        t = t/format;
    }        
    return string(hex.rbegin(), hex.rend());
}
string toHexFromDecimal(long long t) {
        return "0x" + toFormatFromDecimal(t, HEX);
}

string toBinFromDecimal(long long t) {
    return toFormatFromDecimal(t, BIN);
}

これは、long long を 16 進数または 2 進数表現に変換する必要があります。これは、すべての正の数に対して適切に機能しますが、負の数に対しては機能しません。

符号付きの数値も処理するようにコードを拡張する方法はありますか? ありがとうフロリアン

編集:今、私は反対の同様の問題を抱えています(文字列 - >ロングロング

4

4 に答える 4

4

符号付きの値を変換するには、入力を に変換するだけ unsigned long longです。それ以外: 桁数を確立する必要はありません。符号なしの整数型を扱っている場合は、それが になるまで続けて0ください。また、元の値が であっても、少なくとも 1 桁を取得するには、ループ0を使用します。do ... while

std::string results;
unsigned long long tmp = t;
do
{
    results += digits[ tmp % format ];
    tmp /= format;
} while ( tmp != 0 );
std::reverse( results.begin(), results.end() );
return results;

多くの場合、より良い解決策は、最小桁数を引数として渡すことです。

std::string
toString( unsigned long long value, int base, int minSize = 1 )
{
    static char const digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    assert( base >= 2 && base <= 36 );
    std::string results;
    while ( value != 0 || results.size() < minSize ) {
        results += digits[ value % base ];
        value /= base;
    }
    std::reverse( results.begin(), results.end() );
    return results;
}

これにより、必要に応じて固定形式が可能になります。

于 2013-09-25T13:15:55.633 に答える
2

前もって桁数を数える必要はありません。コストがかかり、負の数では機能しません。

2 の補数表現を表示することを指定したため、ネガを避けるためunsigned long longに for yourを使用します。t

次のように、ループを変更してformat、数値がゼロになるまで除算を続けます。

string toFormatFromDecimal(unsigned long long t, Format format) {
    string res = "";
    do {
        res += digits[(int) (t%format)];
        t = t/format;
    } while (t);
    return string(res.rbegin(), res.rend());
}
于 2013-09-25T12:37:54.000 に答える
1

数値が負の場合は、次のことを行う必要があります。

myNumber = Long.MAXVALUE + myNumber + 1;

その後、 を設定しmost significant bitます。

例: Long に 64 ビットがなく、4 ビットしかないとします。

You have the number -3 (1101)
number = 7 + (-3) + 1 = 5 (0101)

これで正の補数が得られました。最上位ビットを設定すると、再び負の数になります。

("1"101) = -1

つまり、あなたがしたように記述することができるあなたの数の正の補数を計算することができます.最上位の 16 進数に 8 を加算します。

4FFAたとえば、正の補数を計算するにはCFFA、に変更する必要がありますC = 4 + 8

于 2013-09-25T12:38:35.473 に答える
0

16 進数のバリアントについてはstd::istringstream、通常のストリーム形式を使用するだけではどうですか?

お気に入り

std::string toHexFromDecimal(long long t) {
    std::istringstream is;
    is << std::hex << t;
    return t.str();
}

バイナリの場合は、次のようになります。

std::string toBinFromDecimal(long long t) {
    std::string s;

    for (int bit = sizeof(t) * 8 - 1; bit >= 0; --bit) {
        s += '0' + (t >> bit) & 1;
    }

    return s;
}
于 2013-09-25T12:36:57.043 に答える