views:

198

answers:

6

I have an int that I want to first convert to a binary number. Then I want to store that binary number in a string. How can this be done?

+2  A: 

http://snippets.dzone.com/posts/show/4716 or http://www.phanderson.com/printer/bin_disp.html are two good examples.

The basic principle of a simple approach:

  • Loop until the # is 0
  • & (bitwise and) the # with 1. Print the result (1 or 0) to the end of string buffer.
  • Shift the # by 1 bit using >>=.
  • Repeat loop
  • Print reversed string buffer

To avoid reversing the string or needing to limit yourself to #s fitting the buffer string length, you can:

  • Compute ceiling(log2(N)) - say L
  • Compute mask = 2^L
  • Loop until mask == 0:
    • & (bitwise and) the mask with the #. Print the result (1 or 0).
    • number &= (mask-1)
    • mask >>= 1 (divide by 2)
DVK
I don't want to just print a binary number, I want to store it in a string.
Phenom
No, the answer isn't perfect, but why don't you think about it and then you'll know forever?
WhirlWind
You don't need to "print" it. Imagine he said "put the result on the end of the string buffer".
Stephen
A: 

There isn't a direct function, you can just walk along the bits of the int (hint see >> ) and insert a '1' or '0' in the string.
Sounds like a standard interview / homework type question

Martin Beckett
What is the man page for that?
Phenom
+1  A: 

I asssume this is related to your other question on Extendible hashing.

First define some mnemonics for your bits:

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

Then you have your number you want to convert to a bit string:

int x = someValue;

You can check if a bit is set by using the logical & operator.

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

And you can keep an std::string and you add 1 to that string if a bit is set, and you add 0 if the bit is not set. Depending on what order you want the string in you can start with the last bit and move to the first or just first to last.

You can refactor this into a loop and using it for arbitrarily sized numbers by calculating the mnemonic bits above using current_bit_value<<=1 after each iteration.

Brian R. Bondy
+1 for researching the user's other posts (and for the answer itself)
advs89
+1  A: 

I have an int that I want to first convert to a binary number.

What exactly does that mean? There is no type "binary number". Well, an int is already represented in binary form internally unless you're using a very strange computer, but that's an implementation detail -- conceptually, it is just an integral number.

Each time you print a number to the screen, it must be converted to a string of characters. It just so happens that most I/O systems chose a decimal representation for this process so that humans have an easier time. But there is nothing inherently decimal about int.

Anyway, to generate a base b representation of an integral number x, simply follow this algorithm:

  1. initialize s with the empty string

  2. m = x % b

  3. x = x / b

  4. convert m into a digit d

  5. append d on s

  6. if x is not zero, goto step 2

  7. reverse s

Step 4 is easy if b <= 10 and your computer uses a character encoding where the digits 0-9 are contiguous, because then it's simply d = '0' + m. Otherwise, you need a lookup table.

Steps 5 and 7 can be simplified to append d on the left of s if you know ahead of time how much space you will need and start from the right end in the string.

In the case of b == 2 (e.g. binary representation), step 2 can be simplified to m = x & 1, and step 3 can be simplified to x = x >> 1.

solution with 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;

}

solution without 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);
}
FredOverflow
+1  A: 

Try this:

#include <bitset>
#include <iostream>
int main()
{
    std::bitset<32>      x(23456);
    std::cout << x << std::endl;
}
Martin York
A: 

convert Decimal to Binary : http://bit.ly/bdFnXr Convert number in String : Use Sprintf Function to store the formatted output in the string variable

c4learn.com