我正在编写一个缓存模拟器,其中使用了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。
答案 0 :(得分:2)
访问数字位的常用方法是在数字和掩码之间进行AND运算。例如
number = 0xFFAA0055; // an example
bit17 = 1 << 17; // counting bit0 as the least significant bit
bit17set = number & bit17;
如果第17位为true
,则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];
}