我正在使用直接映射的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(最后两位)-最后两位
答案 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]