How can i store 2 numbers in a 1 byte char?

5.6k views Asked by At

I have the question of the title, but If not, how could I get away with using only 4 bits to represent an integer?

EDIT really my question is how. I am aware that there are 1 byte data structures in a language like c, but how could I use something like a char to store two integers?

2

There are 2 answers

1
Pynchia On BEST ANSWER

You can store two 4-bit numbers in one byte (call it b which is an unsigned char).

Using hex is easy to see that: in b=0xAE the two numbers are A and E.

Use a mask to isolate them:

a = (b & 0xF0) >> 4

and

e = b & 0x0F

You can easily define functions to set/get both numbers in the proper portion of the byte.

Note: if the 4-bit numbers need to have a sign, things can become a tad more complicated since the sign must be extended correctly when packing/unpacking.

4
kravi On

In C or C++ you can use a struct to allocate the required number of bits to a variable as given below:

#include <stdio.h>
struct packed {
    unsigned char a:4, b:4;
};
int main() {
    struct packed p;
    p.a = 10;
    p.b = 20;
    printf("p.a %d p.b %d size %ld\n", p.a, p.b, sizeof(struct packed));
    return 0;
}

The output is p.a 10 p.b 4 size 1, showing that p takes only 1 byte to store, and that numbers with more than 4 bits (larger than 15) get truncated, so 20 (0x14) becomes 4. This is simpler to use than the manual bitshifting and masking used in the other answer, but it is probably not any faster.