在C ++中转换为二进制

时间:2011-02-28 16:05:21

标签: c++ binary decimal

我创建了一个将数字转换为二进制的函数。由于某种原因,它不起作用。它给出了错误的输出。输出是二进制格式,但它总是给出以零结尾的二进制数的错误结果(至少这是我注意到的......)

unsigned long long to_binary(unsigned long long x)
{
    int rem;
    unsigned long long converted = 0;

    while (x > 1)
    {
        rem = x % 2;
        x /= 2;
        converted += rem;
        converted *= 10;
    }

    converted += x;

    return converted;
}

请帮我解决,这真是令人沮丧......

谢谢!

9 个答案:

答案 0 :(得分:3)

使用std :: bitset进行翻译:

#include <iostream>
#include <bitset>
#include <limits.h>

int main()
{
    int     val;
    std::cin >> val;

    std::bitset<sizeof(int) * CHAR_BIT>    bits(val);
    std::cout << bits << "\n";

}

答案 1 :(得分:2)

  1. 你正在倒转这些位。
  2. 您不能使用x的剩余部分作为终止循环的指示符。
  3. 考虑例如4.

    第一次循环迭代后:

    rem == 0
    converted == 0
    x == 2
    

    第二次循环迭代后:

    rem == 0
    converted == 0
    x == 1
    

    然后你将转换为1。

    尝试:

    int i = sizeof(x) * 8; // i is now number of bits in x
    while (i>0) {
      --i;
      converted *= 10;
      converted |= (x >> i) & 1;
      // Shift x right to get bit number i in the rightmost position, 
      // then and with 1 to remove any bits left of bit number i,
      // and finally or it into the rightmost position in converted
    }
    

    使用x作为无符号字符(8位)运行上面的代码,值为129(二进制10000001)

    i = 8开始,无符号字符的大小* 8.在第一个循环中,迭代i将为7.然后我们取x(129)并将其右移7位,得到值1.这是OR converted变为1.下一次迭代,我们首先将converted乘以10(现在它是10),然后我们转移x 6位右(值变为2),AND与1(值变为0)。我们OR 0和converted,然后是10.第3到第7次迭代做同样的事情,converted乘以10,从x提取一个特定位并进行OR'ed进入converted。在这些迭代之后,converted是1000000。

    在最后一次迭代中,第一个converted乘以10并变为10000000,我们将x右移0位,产生原始值129.我们将AND与x,这给出值1然后将1与OR进行converted,变为10000001。

答案 2 :(得分:1)

你做错了;)

http://www.bellaonline.com/articles/art31011.asp

第一个分区的剩余部分是二进制形式中最右边的位,你的函数变成了最左边的位。

您可以这样做:

unsigned long long to_binary(unsigned long long x)
{
    int rem;
    unsigned long long converted = 0;
    unsigned long long multiplicator = 1;

    while (x > 0)
    {
        rem = x % 2;
        x /= 2;
        converted += rem * multiplicator;
        multiplicator *= 10;
    }

    return converted;
}

编辑:CygnusX1提出的代码效率稍高,但我认为不太全面,我建议采用他的版本。

改进:我改变了while循环的停止条件,所以我们可以删除最后添加x的行。

答案 3 :(得分:0)

你实际上正在翻转二进制数! to_binary(2)将返回01,而不是10.当截断初始0时,它看起来与1相同。

如何这样做:

unsigned long long digit = 1;
while (x>0) {
  if (x%2)
    converted+=digit;
  x/=2;
  digit*=10;
}

答案 4 :(得分:0)

答案 5 :(得分:0)

如果要将数字显示为二进制,则需要将其格式化为字符串。我所知道的最简单的方法是使用STL bitset

#include <bitset>
#include <iostream>
#include <sstream>

typedef std::bitset<64> bitset64;


std::string to_binary(const unsigned long long int& n)
{
        const static int mask = 0xffffffff;
        int upper = (n >> 32) & mask;
        int lower = n & mask;
        bitset64 upper_bs(upper);
        bitset64 lower_bs(lower);
        bitset64 result = (upper_bs << 32) | lower_bs;
        std::stringstream ss;
        ss << result;
        return ss.str();
};

int main()
{
        for(int i = 0; i < 10; ++i)
        {
                std::cout << i << ": " << to_binary(i) << "\n";
        };
        return 1;
};

该程序的输出是:

0: 0000000000000000000000000000000000000000000000000000000000000000
1: 0000000000000000000000000000000000000000000000000000000000000001
2: 0000000000000000000000000000000000000000000000000000000000000010
3: 0000000000000000000000000000000000000000000000000000000000000011
4: 0000000000000000000000000000000000000000000000000000000000000100
5: 0000000000000000000000000000000000000000000000000000000000000101
6: 0000000000000000000000000000000000000000000000000000000000000110
7: 0000000000000000000000000000000000000000000000000000000000000111
8: 0000000000000000000000000000000000000000000000000000000000001000
9: 0000000000000000000000000000000000000000000000000000000000001001

答案 6 :(得分:0)

如果您的目的只是将其显示为二进制表示,那么您可以尝试itoastd::bitset

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

using namespace std;

int main()
{
    unsigned long long x = 1234567890;

    // c way
    char buffer[sizeof(x) * 8];
    itoa (x, buffer, 2);
    printf ("binary: %s\n",buffer);

    // c++ way
    cout << bitset<numeric_limits<unsigned long long>::digits>(x) << endl;

    return EXIT_SUCCESS;
}

答案 7 :(得分:0)

void To(long long num,char *buff,int base)
{
    if(buff==NULL)      return;
    long long m=0,no=num,i=1;

    while((no/=base)>0) i++;
    buff[i]='\0';

    no=num;
    while(no>0)
    {
        m=no%base;
        no=no/base;
        buff[--i]=(m>9)?((base==16)?('A' + m - 10):m):m+48;
    }
}

答案 8 :(得分:0)

这是一个简单的解决方案。

#include <iostream>
using namespace std;
int main()
{
    int num=241; //Assuming 16 bit integer
    for(int i=15; i>=0; i--) cout<<((num >> i) & 1);
    cout<<endl;
    for(int i=0; i<16; i++) cout<<((num >> i) & 1);
    cout<<endl;
    return 0;
}