#include <stdio.h>
#define OBTER_ULTIMOS_BITS(x, k) ((x) & ((1 << (k)) - 1))
#define DESCARTAR_ULTIMOS_BITS(x, k) ((x) >> (k))
typedef struct CACHE {
unsigned int lineSize;
unsigned int associativity;
unsigned int numLines;
} CACHE;
/*unsigned int log2(unsigned int x) {
unsigned long long int resultado = 0;
while (x >>= 1) resultado++;
return resultado;
}*/
int main(void) {
unsigned long long int address = 0x123456789ABCDEFLL;
CACHE cacheconfig;
cacheconfig.lineSize = 20;
cacheconfig.numLines = 200;
cacheconfig.associativity = 4;
unsigned int a = log2(cacheconfig.numLines / cacheconfig.associativity);
unsigned int b = log2(cacheconfig.lineSize);
long unsigned int Tag = DESCARTAR_ULTIMOS_BITS(OBTER_ULTIMOS_BITS(address, cacheconfig.lineSize), b);
long unsigned int Index = DESCARTAR_ULTIMOS_BITS(OBTER_ULTIMOS_BITS(address, b + a), b);
long unsigned int Dado = OBTER_ULTIMOS_BITS(address, b);
printf("%lu,%lu,%lu", Tag
, Index
, Dado
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIE9CVEVSX1VMVElNT1NfQklUUyh4LCBrKSAoKHgpICYgKCgxIDw8IChrKSkgLSAxKSkKI2RlZmluZSBERVNDQVJUQVJfVUxUSU1PU19CSVRTKHgsIGspICgoeCkgPj4gKGspKQoKdHlwZWRlZiBzdHJ1Y3QgQ0FDSEUgewogICAgdW5zaWduZWQgaW50IGxpbmVTaXplOwogICAgdW5zaWduZWQgaW50IGFzc29jaWF0aXZpdHk7CiAgICB1bnNpZ25lZCBpbnQgbnVtTGluZXM7Cn0gQ0FDSEU7CgovKnVuc2lnbmVkIGludCBsb2cyKHVuc2lnbmVkIGludCB4KSB7CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHJlc3VsdGFkbyA9IDA7CiAgICB3aGlsZSAoeCA+Pj0gMSkgcmVzdWx0YWRvKys7CiAgICByZXR1cm4gcmVzdWx0YWRvOwp9Ki8KCmludCBtYWluKHZvaWQpIHsKICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgYWRkcmVzcyA9IDB4MTIzNDU2Nzg5QUJDREVGTEw7CiAgICBDQUNIRSBjYWNoZWNvbmZpZzsKICAgIGNhY2hlY29uZmlnLmxpbmVTaXplID0gMjA7CiAgICBjYWNoZWNvbmZpZy5udW1MaW5lcyA9IDIwMDsKICAgIGNhY2hlY29uZmlnLmFzc29jaWF0aXZpdHkgPSA0OwoKICAgIHVuc2lnbmVkIGludCBhID0gbG9nMihjYWNoZWNvbmZpZy5udW1MaW5lcyAvIGNhY2hlY29uZmlnLmFzc29jaWF0aXZpdHkpOwogICAgdW5zaWduZWQgaW50IGIgPSBsb2cyKGNhY2hlY29uZmlnLmxpbmVTaXplKTsKICAgIGxvbmcgdW5zaWduZWQgaW50IFRhZyA9IERFU0NBUlRBUl9VTFRJTU9TX0JJVFMoT0JURVJfVUxUSU1PU19CSVRTKGFkZHJlc3MsIGNhY2hlY29uZmlnLmxpbmVTaXplKSwgYik7CiAgICBsb25nIHVuc2lnbmVkIGludCBJbmRleCA9IERFU0NBUlRBUl9VTFRJTU9TX0JJVFMoT0JURVJfVUxUSU1PU19CSVRTKGFkZHJlc3MsIGIgKyBhKSwgYik7CiAgICBsb25nIHVuc2lnbmVkIGludCBEYWRvID0gT0JURVJfVUxUSU1PU19CSVRTKGFkZHJlc3MsIGIpOwoKCXByaW50ZigiJWx1LCVsdSwlbHUiLCBUYWcsIEluZGV4LCBEYWRvKTsKCXJldHVybiAwOwp9Cg==