#include <stdio.h>
#include <limits.h>
struct type /* note: bit order is implementation-dependent */
{
unsigned int a : 2;
unsigned int b : 2;
unsigned int c : 4;
};
void showbits(unsigned char byte)
{
unsigned char bit;
for ( bit = 1 << (CHAR_BIT - 1); bit; bit >>= 1 )
{
putchar(byte & bit ? '1' : '0');
}
putchar('\n');
}
int main()
{
struct type value = {2,3,4};
printf("sizeof value = %d\n", (int)(sizeof value));
printf("value.a = %u\n", value.a);
printf("value.b = %u\n", value.b);
printf("value.c = %u\n", value.c);
showbits(*(unsigned char*)&value);
return 0;
}
/* my output
sizeof value = 1
value.a = 2
value.b = 3
value.c = 4
01001110
*/
Dave Sinkula
long time no c
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
This is perhaps a more portable way than my previous post.
#include <stdio.h>
#include <limits.h>
void showbits(unsigned char byte)
{
unsigned char bit;
for ( bit = 1 << (CHAR_BIT - 1); bit; bit >>= 1 )
{
putchar(byte & bit ? '1' : '0');
}
putchar('\n');
}
unsigned char pack(unsigned char a, unsigned char b, unsigned char c)
{
return ((a & 0xF) << 4) | ((b & 0x3) << 2) | (c & 0x3);
}
void unpack(unsigned char value, unsigned char *a, unsigned char *b, unsigned char *c)
{
*a = (value >> 4) & 0xF;
*b = (value >> 2) & 0x3;
*c = value & 0x3;
}
int main()
{
unsigned char a, b, c, value = pack(4,3,2);
printf("sizeof value = %d\n", (int)(sizeof value));
showbits(value);
unpack(value, &a, &b, &c);
printf("a = %d, b = %d, c = %d\n", a, b, c);
return 0;
}
/* my output
sizeof value = 1
01001110
a = 4, b = 3, c = 2
*/
Dave Sinkula
long time no c
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
Binary operations can be somewhat confusing at times, though quite simple to understand. It is customary to refer to a digit in binary (either 1 or 0) as a bit, likewise a byte is a set of eight bits. So, for example, 10100110 is a byte. A "nibble" is half of a byte, as it is a binary number with four bits.
A word is a sixteen-bit binary number. It is equivalent to two bytes, or four nibbles. A double word is a 32-bit binary number, so a dword is equivalent to two words, or four bytes, or eight nibbles. Most commonly, the number of bits (or bytes) in a number-type is referred to as that type's width.
In C and C++ these identities do not necessarily hold. There can be a 16-bit byte and a 1-byte int, and other such configurations.
Dave Sinkula
long time no c
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
thx for ur help, but all this is under the assumption that the first char must be packed in 4 bits, the second in 2bits,.. but what if the sizes increase ,what about if i want to write 200,400,3 in bits how can i do so
Well, if you want to store a nine-bit value (400) in an eight-bit object (the common unsigned char), you are going to have issues now, aren't you?
Dave Sinkula
long time no c
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314
Do your values have a known fixed range? Then the solutions I presented can be modified.
Or are you trying to compress data? Then search for compression algorithms.
Or can each value be of a different size? ASN.1 and BER is a way to handle that one.
What is the "big picture"?
Dave Sinkula
long time no c
5,058 posts since Apr 2004
Reputation Points: 2,780
Solved Threads: 314