抓住标签位的麻烦

问题描述 投票:0回答:1

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

python caching bit-shift
1个回答
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]
© www.soinside.com 2019 - 2024. All rights reserved.