#include <iostream>
#include <cstdint>
struct Addr {
uint32_t offset : 6;
uint32_t index : 10;
uint32_t tag : 16;
Addr(uint32_t addr);
operator uint32_t();
void output();
};
Addr::Addr(uint32_t addr)
: offset(addr & 0x3F),
index((addr & 0xFFC0) >> 6),
tag((addr & 0xFFFF0000) >> 16)
{}
Addr::operator uint32_t() {
return ((offset) | (index << 6) | (tag << 16));
}
void Addr::output() {
std::cout << "Offset: " << std::dec << offset << "\t\t(" << std::hex << offset << ")\n"
<< "Index: " << std::dec << index << " \t(" << std::hex << index << ")\n"
<< "Tag: " << std::dec << tag << (tag > 999 ? "\t(" : "\t\t(")
<< std::hex << tag << ")\n";
}
int main() {
Addr addr = 0xFFFFFFFF;
addr.output();
std::cout << std::hex << static_cast<uint32_t>(addr) << std::endl;
std::cout << "And now, a couple changes...\n";
addr.offset = 0x1A;
addr.index = 0x32F;
addr.output();
std::cout << std::hex << static_cast<uint32_t>(addr) << std::endl;
std::cout << "Once more...\n";
addr = 0x12345678;
addr.output();
std::cout << std::hex << static_cast<uint32_t>(addr) << std::endl;
std::cout << "And finally...\n";
addr = 0x00000001;
addr.output();
std::cout << std::hex << static_cast<uint32_t>(addr) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KCnN0cnVjdCBBZGRyIHsKICAgIHVpbnQzMl90IG9mZnNldCA6ICA2OwogICAgdWludDMyX3QgaW5kZXggIDogMTA7CiAgICB1aW50MzJfdCB0YWcgICAgOiAxNjsKICAgIAogICAgQWRkcih1aW50MzJfdCBhZGRyKTsKCiAgICBvcGVyYXRvciB1aW50MzJfdCgpOwoKICAgIHZvaWQgb3V0cHV0KCk7Cn07CgpBZGRyOjpBZGRyKHVpbnQzMl90IGFkZHIpCiAgOiBvZmZzZXQoYWRkciAmIDB4M0YpLAogICAgaW5kZXgoKGFkZHIgJiAweEZGQzApID4+IDYpLAogICAgdGFnKChhZGRyICYgMHhGRkZGMDAwMCkgPj4gMTYpCnt9CgoKQWRkcjo6b3BlcmF0b3IgdWludDMyX3QoKSB7CiAgICByZXR1cm4gKChvZmZzZXQpIHwgKGluZGV4IDw8IDYpIHwgKHRhZyA8PCAxNikpOwp9Cgp2b2lkIEFkZHI6Om91dHB1dCgpIHsKICAgIHN0ZDo6Y291dCA8PCAiT2Zmc2V0OiAiIDw8IHN0ZDo6ZGVjIDw8IG9mZnNldCA8PCAiXHRcdCgiICA8PCBzdGQ6OmhleCA8PCBvZmZzZXQgPDwgIilcbiIKICAgICAgICAgICAgICA8PCAiSW5kZXg6ICAiIDw8IHN0ZDo6ZGVjIDw8IGluZGV4ICA8PCAiICAgXHQoIiA8PCBzdGQ6OmhleCA8PCBpbmRleCAgPDwgIilcbiIKICAgICAgICAgICAgICA8PCAiVGFnOiAgICAiIDw8IHN0ZDo6ZGVjIDw8IHRhZyAgICA8PCAodGFnID4gOTk5ID8gIlx0KCIgOiAiXHRcdCgiKQogICAgICAgICAgICAgIAkJCQkJCQkJCQkJCSAgPDwgc3RkOjpoZXggPDwgdGFnICAgIDw8ICIpXG4iOwp9CgppbnQgbWFpbigpIHsKICAgIEFkZHIgYWRkciA9IDB4RkZGRkZGRkY7CiAgICBhZGRyLm91dHB1dCgpOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6aGV4IDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihhZGRyKSA8PCBzdGQ6OmVuZGw7CgogICAgc3RkOjpjb3V0IDw8ICJBbmQgbm93LCBhIGNvdXBsZSBjaGFuZ2VzLi4uXG4iOwogICAgYWRkci5vZmZzZXQgPSAweDFBOwogICAgYWRkci5pbmRleCAgPSAweDMyRjsKICAgIGFkZHIub3V0cHV0KCk7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjpoZXggPDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFkZHIpIDw8IHN0ZDo6ZW5kbDsKCiAgICBzdGQ6OmNvdXQgPDwgIk9uY2UgbW9yZS4uLlxuIjsKICAgIGFkZHIgPSAweDEyMzQ1Njc4OwogICAgYWRkci5vdXRwdXQoKTsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmhleCA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYWRkcikgPDwgc3RkOjplbmRsOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgIkFuZCBmaW5hbGx5Li4uXG4iOwogICAgYWRkciA9IDB4MDAwMDAwMDE7CiAgICBhZGRyLm91dHB1dCgpOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6aGV4IDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihhZGRyKSA8PCBzdGQ6OmVuZGw7Cn0=