2014-11-14 96 views
-1

在C中,我試圖將一個整數地址值分隔到具有4組直接映射高速緩存中的標記位和集索引位。我這樣做是爲了讓我可以比較正確的緩存中正確的標記。這裏例如地址參數:高速緩存中的位掩碼

  • 組索引比特s =數2
  • 偏移的比特數B = 3
  • 的地址位的總數M = 8

而在我的例子地址整數是40 - INT地址= 40。

  • 40在二進制是00101000
  • 設定指標應該是01 = 1
  • 標籤應該是001 = 1

而不是爲我得到2標籤和組索引爲8,必須是錯誤的,因爲我只有4套在我的緩存中。

下面是我是如何做到的,我掩蓋了地址以獲取標記,這些標記位於設置索引左側的位直到m = 8位。設置的索引位於標籤位和偏移位之間,即位於8位序列中間的01位。

  • INT標記=((地址&〜0 < <(S + B))>> 4)
  • INT組=(地址&(〜(〜0 < < S)< < b))的

我知道我一定是錯的,但越多我試圖寫一個面具,我越來越困惑,我必須忘記一些東西。我至少認爲我正在獲得標籤,因爲左邊的位應該比中間位更容易。任何意見或幫助將不勝感激,非常感謝!

回答

1

這些方程會爲你工作:

tag = (address >> 5) & 0x7; 
set = (address >> 3) & 0x3; 

如果你想使用的變量sb,並m

tag = (address >> (m-b)) & ((1u << b)-1); 
set = (address >> (m-b-s)) & ((1u << s)-1); 

一般來說,如果你想提取N位開始位i

bits = (value >> i) & ((1u << N)-1);