抓住标签位的麻烦

时间:2019-03-26 17:33:26

标签: python caching bit-shift

我正在使用直接映射的python实现直接映射的缓存。高速缓存中的每一行包含4个字节。由于某种原因,我在使用移位时不能取出前27个位(在这种情况下),最后5位也有麻烦。

我不确定在移位方面我到底在做错什么,但是我所做的一切都没有给我想要的所需位。我现在正在执行某种“硬编码”解决方案,但是将缓存中存储的整数转换为位字符串,并使用python的字符串索引仅获取前27位,尽管我确实想知道如何做到这一点通过移位。


def getTag(d_bytes):
    b = bin(d_bytes)
    b = b[2:]
    return (b[0:27])

是我所指的硬编码解决方案。

如果存储在缓存中的值是 0b11010101010101010000100010001 我想要一个标签: 110101010101010100001000(前27位,如标签=(行大小-索引-偏移量) 索引: 100-标签后的下3位 偏移量为: 01(最后两位)-最后两位

1 个答案:

答案 0 :(得分:1)

您可以通过屏蔽和移位来提取位。

要获取前n位,要使用的掩码为000011 ..(n次).. 11。该掩码可以简单地由(1<<n)-1生成。这等于数字2 ^ n-1,其代码正是我们想要的掩码。

现在,如果要提取单词中任何位置的位域,则必须先将其右移到正确的位置,然后使用遮罩。

因此,对于您的问题,您可以使用

# extract n bits of x starting at position m
def getfield(x,n,m):
    r=x>>m  # shift it right to have lsb of bitfield at position 0
    return r&((1<<n)-1)  # then mask to extract n bits
lsb27=getfield(tag,27,0)  # get bits x[26:0]
msb5=getfield(tag,5,27)   # get bits x[31:27]