在C中,我试图将整数地址值分成带有4组的直接映射缓存中的标记位和设置索引位。我这样做,所以我可以比较正确的缓存集中行的正确标签。这里例如地址参数:
在我的例子中,地址整数是40 - int address = 40.
相反,我得到的标签为2,而设置索引为8则必须是错误的,因为我的缓存中只有4套。
以下是我的工作方式,我对地址进行位掩码以获取标记,这是设置索引左边的位,直到m = 8位。并且设置索引位于标记和偏移位之间,即8位序列中间的01。
我知道我一定是错的,但是我越是试着写一个面具,我越来越困惑,我必须忘记一些事情。我至少认为我得到的标签是正确的,因为左边的位应该比获得中间位更容易。非常感谢任何建议或帮助!
答案 0 :(得分:1)
这些方程式适合您:
tag = (address >> 5) & 0x7;
set = (address >> 3) & 0x3;
如果您想使用变量s
,b
和m
:
tag = (address >> (m-b)) & ((1u << b)-1);
set = (address >> (m-b-s)) & ((1u << s)-1);
通常,如果要从位N
开始提取i
位:
bits = (value >> i) & ((1u << N)-1);