Changing integer to binary string of digits

96,032

Solution 1

There are actually standard one-liners for these.

#include <bitset>

std::string s = std::bitset< 64 >( 12345 ).to_string(); // string conversion

std::cout << std::bitset< 64 >( 54321 ) << ' '; // direct output

std::bitset< 64 > input;
std::cin >> input;
unsigned long ul = input.to_ulong();

See this run as a demo.

Solution 2

Replace:

if((mask&a) >= 1)

with either:

if ((mask & a) != 0)

or:

if (mask & a)

Your problem is that the last bit gives you a negative number, not a positive one.

Solution 3

I checked your code and couldn't find any error. Here is the code that i used...

#include <iostream>
#include <string>
using namespace std;

int main ()
{
  int a=1111165117;
  string binary  ("");
    int mask = 1;
    for(int i = 0; i < 31; i++)
    {
    if((mask&a) >= 1)
        binary = "1"+binary;
    else
        binary = "0"+binary;
     mask<<=1;
 }
 cout<<binary<<endl;
 system("PAUSE");         //optional if not using ideone
 return EXIT_SUCCESS;     //optional if not using ideone
 }

Output will be 1001110001010110101111010011101. I you can run this on ideone

Share:
96,032
Paul Ruiz
Author by

Paul Ruiz

I'm a software engineer with a focus on Android (though learning iOS right now) at Sphero, the company that created the awesome little robotic BB-8 Droid toy from Star Wars.

Updated on September 25, 2020

Comments

  • Paul Ruiz
    Paul Ruiz over 3 years

    I'm currently working on a simulation of the MIPS processor in C++ for a comp architecture class and having some problems converting from decimal numbers to binary (signed numbers both ways). Everything's working fine until the very last bit because my current algorithm falls into out of bounds areas for int on 1<<=31. Just need a nudge in the right direction to get it up and running. Thanks!

    //Assume 32 bit decimal number
    string DecimalToBinaryString(int a)
    {
        string binary = "";
        int mask = 1;
        for(int i = 0; i < 31; i++)
        {
            if((mask&a) >= 1)
                binary = "1"+binary;
            else
                binary = "0"+binary;
            mask<<=1;
        }
        cout<<binary<<endl;
        return binary;
    }
    

    I'm also including my other algorithm for completeness. I apologize for the lack of comments, but it's fairly straight forward.

    int BinaryStringToDecimal(string a)
    {
        int num = 0;
        bool neg = false;
        if(a.at(0) == '1')
        {
            neg = true;
            for(int x = a.length()-1; x >= 0; x--)
            {
                if(a.at(x) == '1')
                    a.at(x) = '0';
                else a.at(x) = '1';
            }
            a.at(a.length()-1) += 1;
            for(int x = a.length()-1; x >= 0; x--)
            {
                if(a.at(x) == '2')
                {
                    if(x-1 >= 0)
                    {
                        if(a.at(x-1) == '1')
                            a.at(x-1) = '2';
                        if(a.at(x-1) == '0')
                            a.at(x-1) = '1';
                        a.at(x) = '0';
                    }
                }
                else if(a.at(x) == '3')
                {
                    if(x-1 >= 0)
                        a.at(x-1) += '2';
                    a.at(x) = '1';
                }
            }
            if(a.at(0) == '2')
                a.at(0) = '0';
            else if(a.at(0) == '3')
                a.at(0) = '1';
        }
        for(int x = a.length()-1; x >= 0; x--)
        {
            if(a.at(x) == '1')
                num += pow(2.0, a.length()-x-1);
        }
        if(neg)
            num = num*-1;   
        return num;
     }
    

    Also if anyone knows any good ways to go about writing these more efficiently I'd love to hear it. I've only had the two introductory programming classes but have been playing with different techniques to see how well I like their style.