mercredi 5 août 2020

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
    // iVal2 should go into the 6 bits after that
    // iVal3 should go into the 2 bits after that
    // 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;
}

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

Aucun commentaire:

Enregistrer un commentaire