#include <iostream>
#include <bitset>
using namespace std;
typedef struct CACHE {
unsigned int lineSize;
unsigned int associativity;
unsigned int numLines;
} CACHE;
unsigned int log2(unsigned int x) {
unsigned int resultado = 0;
while (x >>= 1) resultado++;
return resultado;
}
int main() {
unsigned long long int address = 0x123456789ABCDEFLL;
CACHE cacheconfig;
cacheconfig.lineSize = 20;
cacheconfig.numLines = 200;
cacheconfig.associativity = 4;
string binario = bitset<256>(address).to_string();
int InicioDado = 256-log2(cacheconfig.lineSize);
string dado = binario.substr(InicioDado, log2(cacheconfig.lineSize));
int InicioIndex = InicioDado-log2(cacheconfig.numLines/cacheconfig.associativity);
string index = binario.substr(InicioIndex ,log2(cacheconfig.numLines/cacheconfig.associativity));
int InicioTag = 256-cacheconfig.lineSize;
string tag = binario.substr(InicioTag, 256-InicioTag-log2(cacheconfig.lineSize));
long unsigned int Tag = bitset<256>(tag).to_ulong();
long unsigned int Index = bitset<256>(index).to_ulong();
long unsigned int Dado = bitset<256>(dado).to_ulong();
printf("%lu,%lu,%lu", Tag, Index, Dado);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Yml0c2V0PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgc3RydWN0IENBQ0hFIHsKICAgIHVuc2lnbmVkIGludCBsaW5lU2l6ZTsKICAgIHVuc2lnbmVkIGludCBhc3NvY2lhdGl2aXR5OwogICAgdW5zaWduZWQgaW50IG51bUxpbmVzOwp9IENBQ0hFOwoKdW5zaWduZWQgaW50IGxvZzIodW5zaWduZWQgaW50IHgpIHsKICAgIHVuc2lnbmVkIGludCByZXN1bHRhZG8gPSAwOwogICAgd2hpbGUgKHggPj49IDEpIHJlc3VsdGFkbysrOwogICAgcmV0dXJuIHJlc3VsdGFkbzsKfQoKaW50IG1haW4oKSB7Cgl1bnNpZ25lZCBsb25nIGxvbmcgaW50IGFkZHJlc3MgPSAweDEyMzQ1Njc4OUFCQ0RFRkxMOwoJQ0FDSEUgY2FjaGVjb25maWc7CgljYWNoZWNvbmZpZy5saW5lU2l6ZSA9IDIwOwoJY2FjaGVjb25maWcubnVtTGluZXMgPSAyMDA7CgljYWNoZWNvbmZpZy5hc3NvY2lhdGl2aXR5ID0gNDsKCiAgICBzdHJpbmcgYmluYXJpbyA9IGJpdHNldDwyNTY+KGFkZHJlc3MpLnRvX3N0cmluZygpOwogICAgaW50IEluaWNpb0RhZG8gPSAyNTYtbG9nMihjYWNoZWNvbmZpZy5saW5lU2l6ZSk7CiAgICBzdHJpbmcgZGFkbyA9IGJpbmFyaW8uc3Vic3RyKEluaWNpb0RhZG8sIGxvZzIoY2FjaGVjb25maWcubGluZVNpemUpKTsKICAgIGludCBJbmljaW9JbmRleCA9IEluaWNpb0RhZG8tbG9nMihjYWNoZWNvbmZpZy5udW1MaW5lcy9jYWNoZWNvbmZpZy5hc3NvY2lhdGl2aXR5KTsKICAgIHN0cmluZyBpbmRleCA9IGJpbmFyaW8uc3Vic3RyKEluaWNpb0luZGV4ICxsb2cyKGNhY2hlY29uZmlnLm51bUxpbmVzL2NhY2hlY29uZmlnLmFzc29jaWF0aXZpdHkpKTsKICAgIGludCBJbmljaW9UYWcgPSAyNTYtY2FjaGVjb25maWcubGluZVNpemU7CiAgICBzdHJpbmcgdGFnID0gYmluYXJpby5zdWJzdHIoSW5pY2lvVGFnLCAyNTYtSW5pY2lvVGFnLWxvZzIoY2FjaGVjb25maWcubGluZVNpemUpKTsKICAgIGxvbmcgdW5zaWduZWQgaW50IFRhZyA9IGJpdHNldDwyNTY+KHRhZykudG9fdWxvbmcoKTsKICAgIGxvbmcgdW5zaWduZWQgaW50IEluZGV4ID0gYml0c2V0PDI1Nj4oaW5kZXgpLnRvX3Vsb25nKCk7CiAgICBsb25nIHVuc2lnbmVkIGludCBEYWRvID0gYml0c2V0PDI1Nj4oZGFkbykudG9fdWxvbmcoKTsKCiAgICBwcmludGYoIiVsdSwlbHUsJWx1IiwgVGFnLCBJbmRleCwgRGFkbyk7CglyZXR1cm4gMDsKfQ==