缓存中的位屏蔽

时间:2014-11-14 02:26:03

标签: c caching bit-manipulation bitmask bitwise-and

在C中,我试图将整数地址值分成带有4组的直接映射缓存中的标记位和设置索引位。我这样做,所以我可以比较正确的缓存集中行的正确标签。这里例如地址参数:

  • 设置索引位数s = 2
  • 偏移位数b = 3
  • 地址位总数m = 8

在我的例子中,地址整数是40 - int address = 40.

  • 40 in binary是00101000
  • 设定索引应为01 = 1
  • 标签应为001 = 1

相反,我得到的标签为2,而设置索引为8则必须是错误的,因为我的缓存中只有4套。

以下是我的工作方式,我对地址进行位掩码以获取标记,这是设置索引左边的位,直到m = 8位。并且设置索引位于标记和偏移位之间,即8位序列中间的01。

  • int tag =((地址&〜0<<(s + b))>>> 4)
  • int set =(address&(〜(〜0<< s)<< b))

我知道我一定是错的,但是我越是试着写一个面具,我越来越困惑,我必须忘记一些事情。我至少认为我得到的标签是正确的,因为左边的位应该比获得中间位更容易。非常感谢任何建议或帮助!

1 个答案:

答案 0 :(得分:1)

这些方程式适合您:

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

如果您想使用变量sbm

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

通常,如果要从位N开始提取i位:

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