I have a problem with bit operations. After packing a couple of numbers into one variable and trying to reread those values later, the output of the info function differs from the one of main function.
Code:
#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);
}
Do you know what am I missing here?