2013-02-13 35 views
1

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

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

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

示例:

address = 0x12345678;

index_MSB = 5;

index_LSB = 2;

我需要从地址4个比特[2],以解决[5],这里是1110,并转换为int值:14.

+0

请用一个例子阐明了“当'address'的你的问题,是'this',和'别的东西'是'that',我想'index'是'something''类型...现在不知道你在问什么...'index_MSB'和'index_LSB'的值是什么? – Floris 2013-02-13 01:34:16

回答

2

通常的方式来访问一个位在一个数是做一个数字和掩码之间的AND操作。例如

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

bit17set = number & bit17; 

bit17set将是true如果位17是1,因为只有这样,逻辑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]; 
} 
+0

谢谢,它运作良好。 – ARGOS 2013-02-13 16:55:44

+0

很高兴听到它 - 你使用了两种方法中的哪一种?掩码或循环?你能“接受”答案吗? – Floris 2013-02-13 17:24:16