AdeleGoldberg
AdeleGoldberg

Reputation: 1339

How to encode 3 integer values into an uint16_t using bitwise operations?

I want to store 3 unsigned integer values into an uint16_t variable by doing bitwise operations and read them back using bitwise operations. Following is my program to do that:

Code:

#include <iostream>

uint16_t Write(unsigned int iVal1, unsigned int iVal2, unsigned int iVal3) {
    // iVal1 should go into the first 8 bits [iVal1 value ranges from 0 to 173]
    // iVal2 should go into the 6 bits after that [iVal2 value ranges from 0 to 63]
    // iVal3 should go into the 2 bits after that [iVal3 value ranges from 0 to 3]
    // Is the below way of writing the bits correct?
    return (static_cast<uint16_t>(iVal1)<<8) + (static_cast<uint16_t>(iVal2)<<6) + (static_cast<uint16_t>(iVal3)<<2);
}

unsigned int ReadVal1(const uint16_t theNumber) {
    // ival1 is the first 8 bits
    uint16_t check1 = 255;
    return (theNumber>>8)&check1;
}

unsigned int ReadVal2(const uint16_t theNumber) {
    // ival2 is the 6 bits after that
    uint16_t check2 = 63;
    return (theNumber>>3)&check2;
}

unsigned int ReadVal3(const uint16_t theNumber) {
    // ival3 is the last 2 bits
    uint16_t check3 = 3;
    return (theNumber>>1)&check3;
}

int main() {
    std::cout << "Main started" << std::endl;

    unsigned int iVal1 = 191;
    unsigned int iVal2 = 28;
    unsigned int iVal3 = 3;

    const uint16_t theNumber = Write(iVal1, iVal2, iVal3);

    std::cout << "The first 8 bits contain the number: " << ReadVal1(theNumber) << std::endl;
    std::cout << "Then after 6 bits contain the number: " << ReadVal2(theNumber) << std::endl;
    std::cout << "Then after 2 bits contain the number: " << ReadVal3(theNumber) << std::endl;
}

In above program following are the ranges of the 3 unsigned integers that need to be encoded.

`iVal1` ranges from `0 to 173`. So its well within 8 bits.
`iVal2` ranges from `0 to 63`. So its well within 6 bits.
`iVal3` ranges from `0 to 3`. So its well within 2 bits.

Question:
I think that the way I am writing the values inside the function Write is wrong. What is the correct way?

Primarily, I am looking for a good explanation of how the encoding using bitwise operation works especially in the context of the goal of my program above.

I believe that my way of reading the values in the functions ReadVal1, ReadVal2 and ReadVal3 is correct. I have figured out the trick of how to read back the values which seems easy. But, I could not well understand the logic of how to encode the values correctly using bitwise operations.

C++ compiler:
I am using a C++11 compiler

Upvotes: 2

Views: 627

Answers (1)

n. m. could be an AI
n. m. could be an AI

Reputation: 120001

The number of bits to shift an integer should not depend on the size of the integer being shifted, but on the size of all the integers that come after it (to the right). Here's some ASCII art to illustrate the principle:

                                +---+---+---+---+---+---+---+---+
                                ‖i1 |i1 |i1 |i1 |i1 |i1 |i1 |i1 ‖ 8 bit
                                ‖ 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 ‖
                                +---+---+---+---+---+---+---+---+
                                 _______________________________/
                                /                     
                                |       +---+---+---+---+---+---+
                                |       ‖i2 |i2 |i2 |i2 |i2 |i2 ‖ 6 bit
                                |       ‖ 5 | 4 | 3 | 2 | 1 | 0 ‖
                                |       +---+---+---+---+---+---+
                                |                       ________/
                                |                      /
                                |                      |+---+---+
                                |                      |‖i3 |i3 ‖ 2 bit
                                |                      |‖ 1 | 0 ‖
                                |                      |+---+---+
                                |                      \        |
                                |<<(6+2)                |<<2    |<<0
                                v                       v       v
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
‖ F | E | D | C | B | A | 9 | 8 ‖ 7 | 6 | 5 | 4 | 3 | 2 ‖ 1 | 0 ‖
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
‖i1 |i1 |i1 |i1 |i1 |i1 |i1 |i1 ‖i2 |i2 |i2 |i2 |i2 |i2 ‖i3 |i3 ‖
‖ 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 ‖ 5 | 4 | 3 | 2 | 1 | 0 ‖ 1 | 0 ‖
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

Upvotes: 2

Related Questions