我试图在c ++中获得十六进制值的第6到15位。我正在使用& 0xFFC0,当我打印这些位的值时,我的值超过1024.但由于它的10位可以访问的最高值是1024,对吗?
我有一个32位的地址 tag = 31到16 index = 15到6 offset = 5到0
我的代码看起来像这样
long long offset = address & 0x1F;
long long index = address &0xFFC0;
long long tag = address & 0xFFFF0000;
答案 0 :(得分:0)
由于你的地址是一个32位的位域,我建议你创建一个简单的包装器结构,它可以构造和/或转换为uint32_t
。
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() {
// Weird tabs & spacing are to guarantee proper formatting (in GCC testing environment).
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";
}
这允许您将地址用作32位值,同时还将每个组件隔离为一个不同的变量。
这允许您:
从uint32_t
构建
Addr addr = 0xFFFFFFFF;
用作uint32_t
:
std::cout << std::hex << static_cast<uint32_t>(addr) << '\n';
分别指定字段:
addr.offset = 0x1A;
addr.index = 0x32F;
答案 1 :(得分:-1)
0xFFC0是65472,显然是
address & 0xFFC0
可以是65472(超过1024)。你需要得到第i位
address >> i & 1
将地址右移i位,现在你感兴趣的位是数字的第一位。然后你用1来获得它的价值。