| | |
help me in accessing bits
Please support our C advertiser: Programming Forums - DaniWeb Sister Site
![]() |
•
•
Join Date: Sep 2004
Posts: 6
Reputation:
Solved Threads: 0
Hi,
I want a generate a node that consists of three integers but I want to store these three integers in bits and not bytes
e.g if the node has the values 4,3,2
in integers it will be stored as 00000100-00000011-00000010
but if I store them in bits then they will be 01001110 occupy 1 byte instead of three
taking into consideration that the values are undetermined in the compilation time(I can’t use byte: x 4)
can u tell me how can I do such a thing and how can I dump them as 4,3& 2 again
thx for time
I want a generate a node that consists of three integers but I want to store these three integers in bits and not bytes
e.g if the node has the values 4,3,2
in integers it will be stored as 00000100-00000011-00000010
but if I store them in bits then they will be 01001110 occupy 1 byte instead of three
taking into consideration that the values are undetermined in the compilation time(I can’t use byte: x 4)
can u tell me how can I do such a thing and how can I dump them as 4,3& 2 again
thx for time
#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
*/ "One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
Greetings,
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.
Bit-type Examples:
More information about Binary and its essentials can be found here.
- Stack Overflow
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.
Bit-type Examples:
C Syntax (Toggle Plain Text)
Bit 1 bin Nibble 0110 bin Byte 00100101 bin Word 1110100001010110 bin D Word 10100110000111101110111011010101 bin
More information about Binary and its essentials can be found here.
- Stack Overflow
Following the rules will ensure you get a prompt answer to your question. If posting code, please include BB [code][/code] tags. Your question may have been asked before, try the search facility.
IRC
Channel: irc.daniweb.com
Room: #c, #shell
IRC
Channel: irc.daniweb.com
Room: #c, #shell
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
*/ "One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
•
•
•
•
Originally Posted by Stack Overflow
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.
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
•
•
Join Date: Sep 2004
Posts: 6
Reputation:
Solved Threads: 0
•
•
•
•
Originally Posted by Dave Sinkula
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 */
•
•
•
•
Originally Posted by raar
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
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
•
•
Join Date: Sep 2004
Posts: 6
Reputation:
Solved Threads: 0
•
•
•
•
Originally Posted by Dave Sinkula
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?
actually i can check for the long of the number in binary and make shifting the number dynamically but in such away the problem will be in retreiving the numbers back .
what do u think
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"?
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"?
"One of the methods used by statists to destroy capitalism consists in establishing controls that tie a given industry hand and foot, making it unable to solve its problems, then declaring that freedom has failed and stronger controls are necessary." --Ayn Rand
•
•
Join Date: Sep 2004
Posts: 6
Reputation:
Solved Threads: 0
•
•
•
•
Originally Posted by Dave Sinkula
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"?
values are of no fixed size ,they can be anything but one of them muct always take 7bits(unsigned char)the other two must be packed in bits
so what do u think???????
![]() |
Other Threads in the C Forum
- Previous Thread: reference problems
- Next Thread: need little help bout this...
| Thread Tools | Search this Thread |
* adobe ansi api append array arrays bash binarysearch centimeter char character cm convert copyanyfile copypdffile createcopyoffile createprocess() csyntax directory dynamic execv feet fflush fgets file floatingpointvalidation fork frequency function getlasterror getlogicaldrivestrin givemetehcodez global graphics gtkgcurlcompiling gtkwinlinux hardware highest homework i/o ide infiniteloop initialization interest intmain() kilometer license linked linkedlist linux linuxsegmentationfault list match matrix meter microsoft mqqueue multi mysql oddnumber odf open openwebfoundation pattern pdf pointer pointers posix power program programming pyramidusingturboccodes read recursion recv recvblocked repetition scheduling segmentationfault send shape single socketprogramming stack standard strchr string strings structures suggestions test testautomation unix urboc user voidmain() whythiscodecausesegmentationfault win32api windows.h






