我正在使用直接映射的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(最后两位) - 最后两位
您可以通过屏蔽和移位来提取位。
要获得前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]