Operacje bitowe - odwracanie procesu pakowania

0

Mam problem z operacjami bitowymi. Po zapakowaniu kilku zmiennych do jednej większej, podczas próby wypakowania tych bitów, pojawiają się inne wartości niż te z funkcji main:

#include <iostream>
using namespace std;

unsigned long long extract(unsigned long long value, int begin, int end)
{
    unsigned long long mask = (1 << (end - begin)) - 1;
    return (value >> begin) & mask;
}

unsigned long long encode(int caller, int caller_zone, int callee, int callee_zone, int duration, int tariff)
{
    unsigned long long encoded = 0;

    encoded |= caller;
    encoded <<= 17;
    
    encoded |= caller_zone;
    encoded <<= 7;
    
    encoded |= callee;
    encoded <<= 17;
    
    encoded |= callee_zone;
    encoded <<= 7;
    
    encoded |= duration;
    encoded <<= 13;

    encoded |= tariff;

    return encoded;
}

void info(unsigned long long u)
{
    int caller = extract(u, 47, 64);
    int caller_zone = extract(u, 40, 47);
    int callee = extract(u, 23, 40);
    int callee_zone = extract(u, 16, 23);
    int duration = extract(u, 3, 16);
    int tariff = extract(u, 0, 3);

    cout << "caller:        " << caller << endl
         << "caller_zone:   " << caller_zone << endl
         << "callee:        " << callee << endl
         << "callee_zone:   " << callee_zone << endl
         << "duration:      " << duration << endl
         << "tariff:        " << tariff << endl;
}

int main()
{
    int caller = 130999;    //17-bit number
    int caller_zone = 101;  //7-bit number
    int callee = 7777;      //17-bit number
    int callee_zone = 99;   //7-bit number
    int duration = 7000;    //13-bit number
    int tariff = 6;         //3-bit number

    cout << " FROM MAIN" << endl;
    cout << "caller:        " << caller << endl
         << "caller_zone:   " << caller_zone << endl
         << "callee:        " << callee << endl
         << "callee_zone:   " << callee_zone << endl
         << "duration:      " << duration << endl
         << "tariff:        " << tariff << endl;

    unsigned long long u = encode(caller, caller_zone, callee, callee_zone, duration, tariff);

    cout << "\n FROM INFO" <<endl;
    info(u);
}

Ktoś wie co robię nie tak?

2

Podczas kodowania przesuwasz o tyle ile bitów ma już wpisana liczba, a powinieneś przesunąć o tyle ile ma następna liczba. Przykładowo

encoded |= duration;
encoded <<= 13;
encoded |= tariff;

Powinno tutaj być 3 a nie 13, bo na co mi 13 bitów do przechowywania tariff?

1 użytkowników online, w tym zalogowanych: 0, gości: 1