在 CI 中,我试图将一个整数地址值分成标记位和具有 4 个集合的直接映射缓存中的集合索引位。我这样做是为了比较正确缓存集中的行中的正确标签。这里以地址参数为例:
- 设置索引位数 s=2
- 偏移位数 b=3
- 地址位数 m=8
在我的示例中,地址整数是 40 -- int address = 40。
- 二进制的 40 是 00101000
- 设置索引应为 01 = 1
- 标签应该是 001 = 1
取而代之的是标签,我得到 2 并且集索引是 8,这一定是错误的,因为我的缓存中只有 4 集。
这是我的做法,我对地址进行位掩码以获取标签,这些位是设置索引左侧的位,直到 m=8 位。并且设置的索引位于标记位和偏移位之间,即8位序列中间的01。
- int tag = ((地址 & ~0 << (s + b)) >> 4)
- int set = (address & (~(~0 << s) << b))
我知道我一定是错的,但我越是尝试写一个面具,我就越感到困惑,我一定是忘记了什么。我至少认为我得到了正确的标签,因为左边的位应该比中间的位更容易。任何建议或帮助将不胜感激,非常感谢!