3

我可以itoa()用于将 long long int 转换为二进制字符串吗?

我已经看到了各种使用itoa. 如果我使用 long long int,是否存在溢出或精度损失的风险?

编辑

谢谢大家的回复。我实现了我想要做的事情。itoa()不够有用,因为它不支持 long long int。此外,我不能itoa()在 gcc 中使用,因为它不是标准库函数。

4

4 回答 4

5

要将整数转换为仅包含二进制数字的字符串,您可以通过使用一位掩码检查整数中的每个位并将其附加到字符串来完成。

像这样的东西:

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

编辑:

一种更通用的方法可以使用模板来完成:

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

注意:static_assertstd::is_integral都是 C++11 的一部分,但至少从 4.4.5 开始在 Visual C++ 2010 和 GCC 中都受支持。

于 2012-03-14T09:30:28.987 回答
3

是的你可以。正如您向自己展示的那样,可以使用基数 2 调用 itoa,这意味着二进制。

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

另外,是的,如果您使用大于 int 的整数类型,则会出现截断,因为 itoa() 仅将普通的“int”作为值。long long 在您的编译器上可能是 64 位,而 int 可能是 32 位,因此编译器会在转换之前将 64 位值截断为 32 位值。

于 2012-03-14T09:48:43.527 回答
1

您的措辞有点令人困惑,通常如果您说'decimal'我会认为它的意思是:'a number表示为一串十进制数字',而您的意思似乎是'integer'

对于“二进制”,我将其理解为:“以字节表示的数字 - CPU 可直接使用”

更好的表达主题的方法是:将 64 位整数转换为二进制数字字符串。

有些系统有一个_i64toa功能。

于 2012-03-14T09:51:04.643 回答
0

您可以std::bitset用于此目的

template<typename T>
inline std::string to_binary_string(const T value)
{
    return std::bitset<sizeof(T)>(value).to_string();
}

std::cout << to_binary_string(10240);
std::cout << to_binary_string(123LL);
于 2014-12-08T11:57:45.263 回答