проблема с захватом битов тега - PullRequest
0 голосов
/ 26 марта 2019

Я реализую кэш с прямым отображением, используя 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 (последние два бита) - последние два бита

1 Ответ

1 голос
/ 28 марта 2019

Вы можете извлечь биты, маскируя и сдвигая.

Чтобы получить первые 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]
...