Python 抓取标签位的麻烦

Python 抓取标签位的麻烦,python,caching,bit-shift,Python,Caching,Bit Shift,我正在使用直接映射的python实现一个直接映射缓存。缓存中的每行包含4个字节。由于某种原因,我在使用位移位提取前27位(在本例中)和最后5位时遇到了问题 我不确定我在比特转移方面到底做错了什么,但我所做的一切都没有给我想要的比特。我现在正在做一种“硬编码”的解决方案,但将缓存中存储的整数转换为位字符串,并使用python的字符串索引仅获取前27位,尽管我确实想知道如何通过位移位来实现 是我指的硬编码解决方案 如果缓存中存储的值为 0B1101010101010101000010000011

我正在使用直接映射的python实现一个直接映射缓存。缓存中的每行包含4个字节。由于某种原因,我在使用位移位提取前27位(在本例中)和最后5位时遇到了问题

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



是我指的硬编码解决方案

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

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

要获得前n位,使用的掩码为000011..(n倍)..11。只需使用
(1m)将其右移,即可生成此掩码,使位字段的lsb位于位置0

返回r&((1)您遇到了什么问题?我遇到的问题是我不确定如何通过位移位获取位。我在调用bin后使用字符串索引获取位。
def getTag(d_bytes):
    b = bin(d_bytes)
    b = b[2:]
    return (b[0:27])
# 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]