I would like to encode data about telephone call on a set of 64 bits.
There is 64 total: int caller(first 17 bits), int caller_zone(next 7 bits), int callee(17 bits), int callee_zone(7 bits), int duration(13 bits), int tariff(3 bits)
After endoding I would like decode it back. I have created encode(...) method which encodes data, but I think it is wrong(because after decoding caller back the number is different).
Question: How to correct encode method and how to decode the data back?
Code compiles and runs(it will be easily understood if ran):
#include "stdafx.h"
#include <iostream>
using namespace std;
unsigned long long encode(int caller, int caller_zone, int callee, int callee_zone, int duration, int tariff){
    //I will shift every number to the left an ammount of times so they will cover seperate area of 64 bits of unsigned long long
    unsigned long long p1 = caller;
    int shift = 64 - 17;//first 17 bits
    p1 = __ll_lshift(p1, shift);
    unsigned long long p2 = caller_zone;
    p2 = __ll_lshift(p2, (shift -= 7));//next 7 bits
    unsigned long long p3 = callee;
    p3 = __ll_lshift(p3, (shift -= 17));//next 17 bits
    unsigned long long p4 = callee_zone;
    p4 = __ll_lshift(p4, (shift -= 7));//next 7 bits
    unsigned long long p5 = duration;
    p5 = __ll_lshift(p5, (shift -= 13));//next 13 bits
    unsigned long long p6 = tariff;//last 3 bits
    return p1 | p2 | p3 | p4 | p5 | p6;
}
void info(long long val){
    unsigned long long val1 = 0;
    //
    int caller; int caller_zone;
    int callee; int callee_zone;
    int duration; int tariff;
    caller = __ll_lshift(ULLONG_MAX & val, 64 - 17);
    cout << "caller:      " << caller << endl;
}
int main(){
    int caller = 130999; int caller_zone = 101;
    int callee = 7777; int callee_zone = 99;
    int duration = 7000; int tariff = 6;
    cout << "FROM MAIN" << endl;
    cout << "caller:      " << caller << endl
        << "caller zone: " << caller_zone << endl
        << "calee:       " << callee << endl
        << "calee zone:  " << callee_zone << endl
        << "duration:    " << duration << endl
        << "tariff:      " << tariff << endl;
    unsigned long long u = encode(caller, caller_zone, callee, callee_zone, duration, tariff);
    cout << u << endl;// do skasowania
    cout << "\n FROM INFO" << endl;
    info(u);
    cout << "cos" << endl;
    int val = 21;
    val = __ll_lshift(val, 1);
    cout << val << endl;
    system("pause");
    return 0;
}
 
     
     
    