Convert Integer to Binary | Member | | Join Date: Jul 2007 Location: The Earth
Posts: 115
| | |
Is it possible in C?
Is there a certain formula?
|  | Member | | Join Date: Jun 2007 Location: The Interweb
Posts: 115
| | | re: Convert Integer to Binary
Sure. The general idea works by using remainders. For example, suppose the input value is 9.
9 / 2^4 = 0 remainder 9
9 / 2^3 = 1 remainder 1
1 / 2^2 = 0 remainder 1
1 / 2^1 = 0 remainder 1
1 / 2^0 = 1 remainder 0
[the general equation is (remainder / 2^i)]
So the returned output would be: "01001" -- which is equivalent to 9
The most straight-forward way (but not most efficient) to do this in code (for 0 <= input < 256) is: -
scanf("%d", input);
-
-
for (i = 7; i >= 0; i--)
-
{
-
output[7 - i] = input / pow(2.0, i);
-
input %= (int)pow(2.0, i);
-
}
-
-
for (i = 0; i < 8; i++)
-
printf("%d", output[i]);
-
(Disclaimer: I haven't tested this, but the general idea is the same.)
|  | Familiar Sight | | Join Date: Feb 2007 Location: Washington the state not the District of Columbia, USA.
Posts: 136
| | | re: Convert Integer to Binary
It is always possible to convert in any language you just have to do the math.
I’m guessing the integer is in base 10
So say you have the number 23 that you want to convert into binary
23-(2^4)=7
1
7-(2^3) =put in a zero
0
7-(2^2) =3
1
3-(2^1)=1
1
1-(2^0)=0
1
so 23 base 10 = 10111 binary
And can someone check my work to make sure its correct.
| | Newbie | | Join Date: Jul 2007
Posts: 1
| | | re: Convert Integer to Binary
Why do i set y=pow(x,1/3), the result always be "1.000000"?
For example
y=pow(8,1/3) ---> y=1.000000
|  | Member | | Join Date: Oct 2006 Location: Cork City, Republic of Ireland
Posts: 73
| | | re: Convert Integer to Binary Quote:
Originally Posted by linkid Why do i set y=pow(x,1/3), the result always be "1.000000"?
For example
y=pow(8,1/3) ---> y=1.000000 In C/ C++ the pow function takes two arguments. The first argument is of type float or double or int. The second argument must be of type int.
When you are trying to calculate 8^{1/3} using pow(8,1/3), the second argument is cast into int and as such is rounded to zero, so what you are actually calculating is 8^{0}, which will return 1.
To calculate numbers to non-integer powers you are better off using a Newton Method approach. If you read up on Newton's Method you will find the answer.
Also you shouldn't cross-post, hijack another post. It's rude and against the posting guidelines.
| | Moderator | | Join Date: Mar 2007 Location: North Bend Washington USA
Posts: 5,553
| | | re: Convert Integer to Binary Quote:
Originally Posted by Firecore Is it possible in C?
Is there a certain formula? Use the modulus operator.
Take 23 as an example. The binary is 10111.
Do this:
(23/16) % 2 23/16 which is 1 % 2 which is 1
(23/8 ) % 2 23/8 which is 2 % 2 which is 0
(23/4 ) % 2 23/4 which is 5 % 2 which is 1
(23/2 ) % 2 23/2 which is 11 % 2 which is 1
(23/1 ) % 2 23/1 which is 23% 2 which is 1
You can see the bits and I am sure you can write a loop to vary what you divide into 23 by dividing the divisor by 2 on each cycle of the loop.
| | Member | | Join Date: Jul 2007 Location: The Earth
Posts: 115
| | | re: Convert Integer to Binary
I see.
Thank you very much all of you.
| | Member | | Join Date: Jul 2007
Posts: 111
| | | re: Convert Integer to Binary
All very clever. However, it seems to me everyone is thinking in base 10 and forgetting that the computer thinks in base 2. So why not just extract the bits directly, and save on all those divisions? -
int test = 23;
-
char bin[10];
-
char *p = &bin[8];
-
bin[9] = '\0';
-
int mask = 1;
-
while( mask != 512 ) {
-
if( mask & test )
-
*p-- = '1';
-
else
-
*p-- = '0';
-
mask <<= 1;
-
}
-
printf("%d -> %s\n",test,bin);
-
|  | Expert | | Join Date: Feb 2007
Posts: 839
| | | re: Convert Integer to Binary Quote:
Originally Posted by ravenspoint All very clever. However, it seems to me everyone is thinking in base 10 and forgetting that the computer thinks in base 2. So why not just extract the bits directly, and save on all those divisions? -
int test = 23;
-
char bin[10];
-
char *p = &bin[8];
-
bin[9] = '\0';
-
int mask = 1;
-
while( mask != 512 ) {
-
if( mask & test )
-
*p-- = '1';
-
else
-
*p-- = '0';
-
mask <<= 1;
-
}
-
printf("%d -> %s\n",test,bin);
-
That's pretty good, never would have thought of it, but I think this is easier: -
bitset<8> thirty(30);
-
cout << thirty << endl; // "0001 1110"
-
| | Member | | Join Date: Jul 2007
Posts: 111
| | | re: Convert Integer to Binary
It certainly is easier!
I had never come across that class before.
I wonder, though, if it is not easier to remember how to use the bitwise operators ( there are only two or three of them ) rather than the names and methods of all these obscure 'standard' classes.
|  | Member | | Join Date: Jun 2007 Location: The Interweb
Posts: 115
| | | re: Convert Integer to Binary Quote:
Originally Posted by ravenspoint However, it seems to me everyone is thinking in base 10 and forgetting that the computer thinks in base 2. So why not just extract the bits directly, and save on all those divisions? ... Hence my earlier statement, "[b]ut not most efficient".
Also, it's been a long time since I used C. The OP's question asked how to do it in C. I've known about bitset in C++, but is it legal in standard C? I would have thought the method ravenspoint showed to be nearly the best you could get in standard C.
|  | Expert | | Join Date: Feb 2007
Posts: 839
| | | re: Convert Integer to Binary Quote:
Originally Posted by archonmagnus Hence my earlier statement, "[b]ut not most efficient".
Also, it's been a long time since I used C. The OP's question asked how to do it in C. I've known about bitset in C++, but is it legal in standard C? I would have thought the method ravenspoint showed to be nearly the best you could get in standard C. Yes, you're right, i didn't pay attention that the OP mentioned C. ravenspoint's method is definately one of the best ways to do it in C. The bitset would be the C++ "way".
| | Member | | Join Date: Jul 2007
Posts: 111
| | | re: Convert Integer to Binary
OK, if we are going to use my method, let's clean it up a bit and use a more natural left to right scan. -
int test = 23; // number to convert
-
char bin[10]; // storage for converted binary coded string
-
char *p = bin; // storage pointer
-
int mask = 256; // start with most significant bit
-
while( mask ) { // until no significance remains
-
if( mask & test ) // is bit set?
-
*p++ = '1'; // yes
-
else
-
*p++ = '0'; // no
-
mask >>= 1; // decrease significance
-
}
-
*p = '\0'; // null terminate string
-
printf("%d -> %s\n",test,bin); // ta-da !
-
| | Member | | Join Date: May 2007
Posts: 86
| | | re: Convert Integer to Binary
The problem with ravenspoint is that the number he is converting from is an int but he limits the bitmask to 256, so if someone tried it with a larger integer it would fail.
Here is my solution for 32 bit unsigned integers. Technically, though I should use limits.h to find out exactly the number of bits the particular machine/compiler is using to truly make it portable. - int main()
-
{
-
char bits[33]="00000000000000000000000000000000";
-
int index=0;
-
-
unsigned number = 23;
-
unsigned copy = number;
-
-
while(copy>0) bits[31-index++]='0'+ (1 & copy), copy>>=1;
-
-
printf("%d -> %s\n",number , bits);
-
}
I had a simpler method but it required bool which is not C.
| | Member | | Join Date: Jul 2007
Posts: 111
| | | re: Convert Integer to Binary Quote:
Originally Posted by Darryl The problem with ravenspoint is that the number he is converting from is an int but he limits the bitmask to 256, so if someone tried it with a larger integer it would fail.
Here is my solution for 32 bit unsigned integers. Technically, though I should use limits.h to find out exactly the number of bits the particular machine/compiler is using to truly make it portable. - int main()
-
{
-
char bits[33]="00000000000000000000000000000000";
-
int index=0;
-
-
unsigned number = 23;
-
unsigned copy = number;
-
-
while(copy>0) bits[31-index++]='0'+ (1 & copy), copy>>=1;
-
-
printf("%d -> %s\n",number , bits);
-
}
Problem in line #9 - the "," should be a ";" I think.
It is not good to cram so much code into one line, The compiler can keep it all straight, but it hurts my head to look at it!
| | Member | | Join Date: May 2007
Posts: 86
| | | re: Convert Integer to Binary Quote:
Originally Posted by ravenspoint Problem in line #9 - the "," should be a ";" I think. No, that's right, I think C uses the comma operator too. Quote:
Originally Posted by ravenspoint It is not good to cram so much code into one line, The compiler can keep it all straight, but it hurts my head to look at it! Yea, but I hate vertical space, I think I read once, debugging is easier and code is less likely to have errors if you can view it all at once without scrolling.
|  | Expert | | Join Date: Feb 2007
Posts: 839
| | | re: Convert Integer to Binary
Hey, I found another way: -
char buffer[33];
-
int num = 30;
-
itoa(num, buffer, 2);
-
cout << buffer << endl;
-
| | Member | | Join Date: Jul 2007
Posts: 111
| | | re: Convert Integer to Binary Quote:
Originally Posted by ilikepython Hey, I found another way: -
char buffer[33];
-
int num = 30;
-
itoa(num, buffer, 2);
-
cout << buffer << endl;
-
Bravissimo!
Today's lesson: RTFM
Parameters
value
Number to be converted
string
String result
radix
Base of value; must be in the range 2 – 36
|  | Administrator | | Join Date: Feb 2006 Location: South West UK
Posts: 6,463
| | | re: Convert Integer to Binary Quote:
Originally Posted by Darryl Yea, but I hate vertical space, I think I read once, debugging is easier and code is less likely to have errors if you can view it all at once without scrolling. This is true, however it does not mean cram all the code onto one line otherwise by that argument your code is most maintainable in this form -
#include "stdio.h"
-
int main(){ char bits[33]="00000000000000000000000000000000"; int index=0; unsigned number = 23, copy = number; while(copy>0) bits[31-index++]='0'+ (1 & copy), copy>>=1; printf("%d -> %s\n",number , bits);}
-
What that statement means is that you should keep the individual code units (functions) small enough that the fit on your screen without the need to scroll, not that you should compress your code by using shortcuts and leaving out vertical space. The first will increase maintainability and reduce the chance of putting bugs in in the first place the second will result in less maintainable harder to read code.
A good rule of thumb is "<= 1 statement per line"
In general the comma operator is not a particularly useful one and normally only sees usage in the 1st and 3rd expressions of a for loop.
| | Member | | Join Date: Apr 2007
Posts: 47
| | | re: Convert Integer to Binary
Python, what does itoa mean in your code?
|  | Expert | | Join Date: Feb 2007
Posts: 839
| | | re: Convert Integer to Binary Quote:
Originally Posted by joeschnell Python, what does itoa mean in your code? The function means to turn an integer into a string. The name just means integer to ascii (string) (i to a).
| | Newbie | | Join Date: Aug 2007 Location: PUNE
Posts: 2
| | | re: Convert Integer to Binary
[HTML] - #include<stdio.h>
-
#include<math.h>
-
-
int main(int argc, char *argv[]){
-
int num=atoi(argv[1]),r,bin[10]; // takes number from commandline argument
-
for(i=0;i<10;i++)
-
bin[i]=3;
-
i=0;
-
while(num!=0){
-
r=num%2;
-
bin[i]=r;
-
i++:
-
num=num/2;
-
-
}
-
printf("\nNumber %d in binary is..\n");
-
for(i=9;i>=0;i--)
-
if(bin[i]!=3) printf("%d",bin[i]);
-
getch();
-
return 0;
-
}
This codes shows converting number from decimal to binary. [/HTML]
| | Newbie | | Join Date: Aug 2007 Location: PUNE
Posts: 2
| | | re: Convert Integer to Binary - #include<stdio.h>
-
#include<math.h>
-
-
int main(int argc, char *argv[]){
-
int num=atoi(argv[1]),r,bin[10]; // takes number from commandline argument
-
for(i=0;i<10;i++)
-
bin[i]=3;
-
i=0;
-
while(num!=0){
-
r=num%2;
-
bin[i]=r;
-
i++:
-
num=num/2;
-
-
}
-
printf("\nNumber %d in binary is..\n");
-
for(i=9;i>=0;i--)
-
if(bin[i]!=3) printf("%d",bin[i]);
-
getch();
-
return 0;
-
}
This codes shows converting number from decimal to binary. |  | | | | Forums
Visit our community forums for general discussions and latest on Bytes
/bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 229,155 network members.
|