访问bitset中的多个位

时间:2013-02-13 01:31:47

标签: c++

我正在编写一个缓存模拟器,其中使用了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。

1 个答案:

答案 0 :(得分:2)

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

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

bit17set = number & bit17;
如果第17位为true,则 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();

注意:以上所有假设&#34;正常&#34;带有位的数字&#34;常规&#34;。如果您的address包含的方式无法通过上述方法访问,则可以执行以下操作:

int ii, index=0;
for(ii=index_MSB; ii>= index_LSB; ii--) {
    index = (index << 1) + address[ii];
}