Domanda

Posso usare itoa() per convertire a lungo int a una stringa binaria? Ho visto vari esempi per la conversione di int a binary utilizzando itoa.Esiste il rischio di traboccare o forse perdita di precisione, se utilizzo lungo int.

Edit- Grazie a tutti voi per aver risposto.Ho raggiunto quello che stavo cercando di fare.ITOA () non è stato abbastanza utile, poiché non supporta a lungo lungo int.moreover non riesco ad usare iToa () in GCC in quanto non è una funzione di libreria standard.

È stato utile?

Soluzione

Per convertire un numero intero su una stringa contenente solo cifre binarie, è possibile farlo controllando ogni bit nel numero intero con una maschera unita e aggiungerla alla stringa.

Qualcosa del genere:

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;
}
.

Modifica:

Un modo più generale di farlo potrebbe essere fatto con i modelli:

#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;
}
.

Nota: sia static_assert che std::is_integral è parte di C ++ 11, ma è supportato sia in Visual C ++ 2010 che in GCC da almeno 4.4.5.

Altri suggerimenti

Sì, puoi.Come you ha mostrato te stesso , Itoa può essere chiamato con base 2, il che significa binario.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i;
    char str[33];

    i = 37; /* Just some number. */
    itoa (i, str, 2);
    printf("binary: %s\n", str);

    return 0;
}
.

Inoltre, sì, ci sarà il troncamento se si utilizza un tipo intero più grande di int, poiché ITOA () richiede solo una semplice "int" come valore.Lunga lunga è sul tuo compilatore probabilmente 64 bit mentre int è probabilmente 32 bit, quindi il compilatore troncierebbe il valore di 64 bit a un valore a 32 bit prima della conversione.

La tua formulazione è un po 'confusa, Normalmente se dichiari 'decimale', vorrei dire che significhi: "Un numero rappresentato come una stringa di cifre decimali", mentre sembri "Integer".

E con "binario" prenderei ciò per significare: "Un numero rappresentato come byte - come direttamente utilizzabile dalla CPU".

Un modo migliore di frase, il tuo soggetto sarebbe: convertire il numero intero a 64 bit sulla stringa di cifre binarie.

Alcuni sistemi hanno una funzione _i64toa.

Il modo standard per convertire in long long è strtoull() e std::strtoull() per C e C ++ rispettivamente

Esempio su 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';
    }
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top