如何在C ++中将int转换为二进制字符串表示形式

时间:2010-05-23 02:25:17

标签: c++ string binary g++

我有一个int,我想存储为二进制字符串表示。怎么办呢?

10 个答案:

答案 0 :(得分:38)

试试这个:

#include <bitset>
#include <iostream>
int main()
{
    std::bitset<32>      x(23456);
    std::cout << x << "\n";


    // If you don't want a variable just create a temporary.
    std::cout << std::bitset<32>(23456) << "\n";
}

答案 1 :(得分:14)

  

我有一个int,我想先转换为二进制数。

究竟是什么意思?没有类型“二进制数”。好吧,int已经在内部以二进制形式表示,除非你使用的是一台非常奇怪的计算机,但这是一个实现细节 - 从概念上讲,它只是一个整数。

每次在屏幕上打印数字时,都必须将其转换为字符串。事实上,大多数I / O系统都为此过程选择了十进制表示,以便人们有更轻松的时间。但是int没有任何固有的小数点。

无论如何,要生成整数b的基本x表示,只需遵循此算法:

  1. 使用空字符串

  2. 初始化s
  3. m = x % b

  4. x = x / b

  5. m转换为数字d

  6. d上附加s

  7. 如果x不为零,请转到第2步。

  8. 反向s

  9. 如果b <= 10并且您的计算机使用数字0-9连续的字符编码,则步骤4很简单,因为它只是d = '0' + m。否则,您需要一个查找表。

    如果您提前知道需要多少空间并从字符串的右端开始,则可以简化步骤5和7以在d的左侧附加s

    如果是b == 2(例如二进制表示),则第2步可以简化为m = x & 1,第3步可以简化为x = x >> 1

    reverse的解决方案:

    #include <string>
    #include <algorithm>
    
    std::string binary(unsigned x)
    {
        std::string s;
        do
        {
            s.push_back('0' + (x & 1));
        } while (x >>= 1);
        std::reverse(s.begin(), s.end());
        return s;
    }
    

    没有reverse的解决方案:

    #include <string>
    
    std::string binary(unsigned x)
    {
        // Warning: this breaks for numbers with more than 64 bits
        char buffer[64];
        char* p = buffer + 64;
        do
        {
            *--p = '0' + (x & 1);
        } while (x >>= 1);
        return std::string(p, buffer + 64);
    }
    

答案 2 :(得分:2)

http://snippets.dzone.com/posts/show/4716http://www.phanderson.com/printer/bin_disp.html是两个很好的例子。

简单方法的基本原则:

  • 循环直到#为0
  • &(按位和)#with 1.将结果(1或0)打印到字符串缓冲区的末尾。
  • 使用>>=将#转换为1位。
  • 重复循环
  • 打印反向字符串缓冲区

为避免反转字符串或需要将自己限制为符合缓冲区字符串长度的#s,您可以:

  • 计算上限(log2(N)) - 比如L
  • 计算模板= 2 ^ L
  • 循环直到面具== 0:
    • &(按位和)带#的掩码。打印结果(1或0)。
    • number&amp; =(mask-1)
    • mask&gt;&gt; = 1(除以2)

答案 3 :(得分:1)

我认为这与您关于可扩展散列的其他问题有关。

首先为您的位定义一些助记符:

const int FIRST_BIT = 0x1;
const int SECOND_BIT = 0x2;
const int THIRD_BIT = 0x4;

然后你要将你的号码换成一个字符串:

int x = someValue;

您可以使用逻辑&运算符检查是否设置了位。

if(x & FIRST_BIT)
{
    // The first bit is set.
}

如果设置了一个位,你可以保留一个std :: string并在该字符串中加1,如果未设置该位,则加0。根据你想要的顺序,你可以从最后一位开始,然后移到第一位或者只是从第一位开始。

你可以将它重构成一个循环,并通过在每次迭代后使用current_bit_value&lt;&lt; = 1来计算上面的助记符位,将其用于任意大小的数字。

答案 4 :(得分:1)

AND数字为100000 ...,然后是010000 ...,0010000 ......等。每次,如果结果为0,在char数组中放一个'0',否则放一个'1'

int numberOfBits = sizeof(int) * 8;
char binary[numberOfBits + 1];
int decimal = 29;

for(int i = 0; i < numberOfBits; ++i) {
    if ((decimal & (0x80000000 >> i)) == 0) {
        binary[i] = '0';
    } else {
        binary[i] = '1';
    }
}
binary[numberOfBits] = '\0';
string binaryString(binary);

答案 5 :(得分:0)

没有直接的功能,你可以沿着int的位(提示参见&gt;&gt;)并在字符串中插入'1'或'0'。 听起来像标准的面试/家庭作业类型问题

答案 6 :(得分:0)

使用sprintf函数将格式化的输出存储在字符串变量中,而不是printf用于直接打印。但请注意,这些函数仅适用于C字符串,而不适用于C ++字符串。

答案 7 :(得分:0)

您可以使用一个只有小标题的库here

示例:

std::cout << ConvertInteger<Uint32>::ToBinaryString(21);
// Displays  "10101"

auto x = ConvertInteger<Int8>::ToBinaryString(21, true);
std::cout << x << "\n"; // displays "00010101"

auto x = ConvertInteger<Uint8>::ToBinaryString(21, true, "0b");
std::cout << x << "\n"; // displays "0b00010101"

答案 8 :(得分:0)

无反向,无附加副本且填充为0的解决方案:

#include <iostream>
#include <string>

template <short WIDTH>
std::string binary( unsigned x )
{
    std::string buffer( WIDTH, '0' );
    char *p = &buffer[ WIDTH ];

    do {
        --p;
        if (x & 1) *p = '1';
    }
    while (x >>= 1);

    return buffer;
}

int main()
{
    std::cout << "'" << binary<32>(0xf0f0f0f0) << "'" << std::endl;
    return 0;
}

答案 9 :(得分:0)

这是我的最好的整数(任何类型)转换成的std :: string的实现。如果仅将模板用于单个整数类型,则可以删除模板。据我所知,我认为C ++的安全性与C的隐秘性之间取得了很好的平衡。请确保包括所需的标头。

template<typename T>
std::string bstring(T n){
    std::string s;
    for(int m = sizeof(n) * 8;m--;){
            s.push_back('0'+((n >> m) & 1));
    }
    return s;
}

像这样使用它

std::cout << bstring<size_t>(371) << '\n';

这是在我的电脑的输出(它不同于在每台计算机上),

0000000000000000000000000000000000000000000000000000000101110011

请注意,整个二进制串被拷贝并且因此填充的零,这有助于表示比特大小。因此字符串的长度的大小的为size_t 中位。

让我们尝试使用有符号整数(负数)

std::cout << bstring<signed int>(-1) << '\n';

这是我计算机上的输出(如上所述,每台计算机上都不同),

11111111111111111111111111111111

请注意,现在字符串更小了,这证明 signed int 所消耗的空间少于 size_t 。如您所见,我的计算机使用 2的补码方法表示带符号整数(负数)。现在,您可以了解为什么unsigned short(-1) > signed int(1)

下面是一个版本只是对于符号整数取得了令这个功能没有模板,即使用这个,如果你只打算转换的符号整数以字符串。

std::string bstring(int n){
    std::string s;
    for(int m = sizeof(n) * 8;m--;){
            s.push_back('0'+((n >> m) & 1));
    }
    return s;
}