Konvertieren einer Ganzzahl in eine Binärzeichenfolge mithilfe von itoa in C/C++

StackOverflow https://stackoverflow.com//questions/9698986

  •  13-12-2019
  •  | 
  •  

Frage

Kann ich benutzen itoa() zum Konvertieren von long long int in eine Binärzeichenfolge?Ich habe verschiedene Beispiele für die Konvertierung von int in binär gesehen itoa.Besteht die Gefahr eines Überlaufs oder möglicherweise eines Präzisionsverlusts, wenn ich long long int verwende?

Bearbeiten – Vielen Dank an alle für die Antwort.Ich habe erreicht, was ich erreichen wollte.itoa() war nicht nützlich genug, da es long long int nicht unterstützt. Außerdem kann ich itoa() in gcc nicht verwenden, da es keine Standardbibliotheksfunktion ist.

War es hilfreich?

Lösung

Um eine Ganzzahl in eine Zeichenfolge umzuwandeln, die nur Binärziffern enthält, können Sie jedes Bit in der Ganzzahl mit einer Ein-Bit-Maske überprüfen und an die Zeichenfolge anhängen.

Etwas wie das:

std::string convert_to_binary_string(const unsigned long long int value,
                                     bool skip_leading_zeroes = false)
{
    std::string str;
    bool found_first_one = false;
    const int bits = sizeof(unsigned long long) * 8;  // Number of bits in the type

    for (int current_bit = bits - 1; current_bit >= 0; current_bit--)
    {
        if ((value & (1ULL << current_bit)) != 0)
        {
            if (!found_first_one)
                found_first_one = true;
            str += '1';
        }
        else
        {
            if (!skip_leading_zeroes || found_first_one)
                str += '0';
        }
    }

    return str;
}

Bearbeiten:

Eine allgemeinere Möglichkeit könnte die Verwendung von Vorlagen sein:

#include <type_traits>
#include <cassert>

template<typename T>
std::string convert_to_binary_string(const T value, bool skip_leading_zeroes = false)
{
    // Make sure the type is an integer
    static_assert(std::is_integral<T>::value, "Not integral type");

    std::string str;
    bool found_first_one = false;
    const int bits = sizeof(T) * 8;  // Number of bits in the type

    for (int current_bit = bits - 1; current_bit >= 0; current_bit--)
    {
        if ((value & (1ULL << current_bit)) != 0)
        {
            if (!found_first_one)
                found_first_one = true;
            str += '1';
        }
        else
        {
            if (!skip_leading_zeroes || found_first_one)
                str += '0';
        }
    }

    return str;
}

Notiz:Beide static_assert Und std::is_integral ist Teil von C++11, wird aber sowohl in Visual C++ 2010 als auch in GCC ab mindestens 4.4.5 unterstützt.

Andere Tipps

ja, du kannst.Wie Sie sich in zeigte, dass Itoa mit Base 2 aufgerufen werden kann, was binär ist.

generasacodicetagpre.

Ja, ja, es wird abgeschnitten, wenn Sie einen ganzzahligen Ganzzahl-Typ als int verwenden, da ITOA () nur ein einfaches "Int" als Wert anzieht.Lang lang ist auf Ihrem Compiler wahrscheinlich 64 Bit, während int wahrscheinlich 32 Bit ist, so dass der Compiler den 64-Bit-Wert vor der Konvertierung auf einen 32-Bit-Wert schneiden würde.

Ihr Wortlaut ist ein bisschen verwirrend, Wenn Sie normalerweise "Dezimalstellen" geben, würde ich das bedeuten: "Eine Zahl, die als Saite von Dezimalstellen dargestellt wird, während Sie" ganzzahlige "scheinen.

und mit 'Binary' würde ich das nehmen, um zu bedeuten: "Eine Zahl, die als Bytes dargestellt wird - so direkt von der CPU genügt".

Eine bessere Art der Formierung Ihres Subjekts wäre: Umwandeln der 64-Bit-Ganzzahl in binäre Ziffern.

Einige Systeme haben eine _i64toA-Funktion.

Die Standardmethode zum Konvertieren long long Ist strtoull() Und std::strtoull() für C bzw. C++

Beispiel für cppreference

#include <iostream>
#include <cstdlib>

int main()
{
    const char* begin = "10 200000000000000000000000000000 30 40";
    char *end;
    for (unsigned long i = std::strtoul(begin, &end, 10);
         begin != end;
         i = std::strtoul(begin, &end, 10))
    {
        begin = end;
        if (errno == ERANGE){
            std::cout << "range error\n";
            errno = 0;
        }    
        std::cout << i << '\n';
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top