抓取标签位的麻烦
trouble with grabbing tag bits
我正在使用直接映射的 python 实现直接映射缓存。缓存中的每一行包含 4 个字节。由于某种原因,我在使用位移位取出第一个(在本例中)27 位和最后 5 位时遇到了麻烦。
我不确定我在位移方面到底做错了什么,但我所做的一切都没有给我想要的位。我现在正在做一种 "hard-coded" 解决方案,但是将存储在缓存中的整数转换为位字符串,并使用 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]
我正在使用直接映射的 python 实现直接映射缓存。缓存中的每一行包含 4 个字节。由于某种原因,我在使用位移位取出第一个(在本例中)27 位和最后 5 位时遇到了麻烦。
我不确定我在位移方面到底做错了什么,但我所做的一切都没有给我想要的位。我现在正在做一种 "hard-coded" 解决方案,但是将存储在缓存中的整数转换为位字符串,并使用 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]