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?
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)
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
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.
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:
initialize
s
with the empty stringm = x % b
x = x / b
convert
m
into a digitd
append
d
ons
if
x
is not zero, goto step 2reverse
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);
}
Try this:
#include <bitset>
#include <iostream>
int main()
{
std::bitset<32> x(23456);
std::cout << x << std::endl;
}
convert Decimal to Binary : http://bit.ly/bdFnXr Convert number in String : Use Sprintf Function to store the formatted output in the string variable