从十六进制值获取某些位

时间:2016-11-10 19:02:57

标签: c++ hex

我试图在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;

2 个答案:

答案 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;
    

如果您希望十六进制输出与其在地址中的实际位置对齐,请参阅操作herehere

答案 1 :(得分:-1)

0xFFC0是65472,显然是

address & 0xFFC0

可以是65472(超过1024)。你需要得到第i位

address >> i & 1

将地址右移i位,现在你感兴趣的位是数字的第一位。然后你用1来获得它的价值。