1

我正在编写一个缓存模拟器,其中使用了 32 位地址。我使用 bitset<32> 来存储地址。当我尝试访问地址的多个位进行解码时,会遇到一个问题。例如:

int index = address[index_MSB, index_LSB].to_ulong();

我尝试访问地址中的一些位并转换为 int。它会导致错误。有没有办法做到这一点?谢谢!

例子:

地址 = 0x12345678;

index_MSB = 5;

index_LSB = 2;

我需要从地址 [2] 到地址 [5] 的 4 位,这里是 1110,然后转换为 int 值:14。

4

1 回答 1

1

访问数字中的位的常用方法是在数字和掩码之间进行 AND 操作。例如

number = 0xFFAA0055; // an example
bit17 = 1 << 17;     // counting bit0 as the least significant bit

bit17set = number & bit17;

true如果第 17 位是,则bit17set 将是1,因为只有这样,逻辑才会AND产生非零结果。

如果您对多个位感兴趣,您可以在 AND 之前简单地将它们的掩码相加:

bit6 = 1 << 6;

bit6or17 = bit6 + bit17;
bit6or17set = number & bit6or17;

当您想要从 MSB 到 LSB 的地址位时,最简单的操作是:

temp = number >> LSB; // this shifts LSB numbers to the right
answer = temp & ((1<<(MSB-LSB+1) - 1); // a mask of MSB-LSB bits

您当然可以将这两者结合起来:

int index = ((address >> index_LSB) & (1<<(index_MSB - index_LSB+1)-1)).to_ulong();

注意:以上所有内容都假设“正常”数字,并且“按常规”存储位。如果您address以上述方法无法访问的方式包含位,则可以执行以下操作:

int ii, index=0;
for(ii=index_MSB; ii>= index_LSB; ii--) {
    index = (index << 1) + address[ii];
}
于 2013-02-13T01:43:53.983 回答