2013-02-13 27 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