Conversion of Char to Binary in C
Solution 1
We show up two functions that prints a SINGLE character to binary.
void printbinchar(char character)
{
char output[9];
itoa(character, output, 2);
printf("%s\n", output);
}
printbinchar(10) will write into the console
1010
itoa is a library function that converts a single integer value to a string with the specified base. For example... itoa(1341, output, 10) will write in output string "1341". And of course itoa(9, output, 2) will write in the output string "1001".
The next function will print into the standard output the full binary representation of a character, that is, it will print all 8 bits, also if the higher bits are zero.
void printbincharpad(char c)
{
for (int i = 7; i >= 0; --i)
{
putchar( (c & (1 << i)) ? '1' : '0' );
}
putchar('\n');
}
printbincharpad(10) will write into the console
00001010
Now i present a function that prints out an entire string (without last null character).
void printstringasbinary(char* s)
{
// A small 9 characters buffer we use to perform the conversion
char output[9];
// Until the first character pointed by s is not a null character
// that indicates end of string...
while (*s)
{
// Convert the first character of the string to binary using itoa.
// Characters in c are just 8 bit integers, at least, in noawdays computers.
itoa(*s, output, 2);
// print out our string and let's write a new line.
puts(output);
// we advance our string by one character,
// If our original string was "ABC" now we are pointing at "BC".
++s;
}
}
Consider however that itoa don't adds padding zeroes, so printstringasbinary("AB1") will print something like:
1000001
1000010
110001
Solution 2
unsigned char c;
for( int i = 7; i >= 0; i-- ) {
printf( "%d", ( c >> i ) & 1 ? 1 : 0 );
}
printf("\n");
Explanation:
With every iteration, the most significant bit is being read from the byte by shifting it and binary comparing with 1.
For example, let's assume that input value is 128, what binary translates to 1000 0000. Shifting it by 7 will give 0000 0001, so it concludes that the most significant bit was 1. 0000 0001 & 1 = 1. That's the first bit to print in the console. Next iterations will result in 0 ... 0.
Solution 3
Your code is very vague and not understandable, but I can provide you with an alternative.
First of all, if you want temp
to go through the whole string, you can do something like this:
char *temp;
for (temp = your_string; *temp; ++temp)
/* do something with *temp */
The term *temp
as the for
condition simply checks whether you have reached the end of the string or not. If you have, *temp
will be '\0'
(NUL
) and the for
ends.
Now, inside the for, you want to find the bits that compose *temp
. Let's say we print the bits:
for (as above)
{
int bit_index;
for (bit_index = 7; bit_index >= 0; --bit_index)
{
int bit = *temp >> bit_index & 1;
printf("%d", bit);
}
printf("\n");
}
To make it a bit more generic, that is to convert any type to bits, you can change the bit_index = 7
to bit_index = sizeof(*temp)*8-1
darksky
C, C++, Linux, x86, Python Low latency systems Also: iOS (Objective-C, Cocoa Touch), Ruby, Ruby on Rails, Django, Flask, JavaScript, Java, Bash.
Updated on May 11, 2020Comments
-
darksky almost 4 years
I am trying to convert a character to its binary representation (so character --> ascii hex --> binary).
I know to do that I need to shift and
AND
. However, my code is not working for some reason.Here is what I have.
*temp
points to an index in a C string.char c; int j; for (j = i-1; j >= ptrPos; j--) { char x = *temp; c = (x >> i) & 1; printf("%d\n", c); temp--; }
-
visual_learner over 12 yearsTechnically, it should be
i = CHAR_BIT - 1
. You know, for all those 9- and 11-bit processors out there. -
darksky over 12 yearsI don't understand what you mean by
iota don't adds padding zeros
. So what's the different between usingiota
and using the shift and & method? -
darksky over 12 yearsThis is wrong. itoa takes an integer, and you're passing *s, a character.
-
Salvatore Previti over 12 yearsNot an error. *s means the first character pointed by the string s. In c characters are just 8 bit integer (nowadays).
-
Salvatore Previti over 12 yearsitoa(10, output, 2) will write into output string the string "1010".
-
Salvatore Previti over 12 yearsprintbincharpad(10) will write into the console the string "00001010".
-
WhozCraig over 9 years@SalvatorePreviti My problem with
itoa()
isn't the passing of achar
, (promotion will occur, though sign extension can be a problem with high ascii). Its thatitoa
isn't part of the standard C library in the first place, and as such should be avoided if portability is desired. Your alternative is a much better fit, and much closer to standard-compliant (that hard-coded7
inprintbincharpad
should beCHAR_BIT-1
and<limits.h>
should be included).