对于家庭作业,我必须用C解析CPUID指令输出,这需要很多特定的位操作,例如:
(eax & CACHE_LEVEL) >> 5我计算了面罩CACHE_LEVEL和需要用手正确移动的数量。这很痛苦,所以我决定编写几个Python函数来帮助解决这个问题。
例如:
>>> eax = 0x4004121 # Taken from a register after executing a CPUID instruction with leaf-4 indicated
>>> parse_out_bits(eax, 5, 7) # Return the value at bits 5 to 7 (inclusive)
1 # This is an L1 cache索引是基于0的和包容性的.
其中,eax如下所示,我希望从S到E的位的值:
E S
100 0000 0000 0100 0001 0010 0001我想要在这里的任何笔记,但特别是如何可以做得更好,在比特操作。
from typing import Generator
def bit_place_values(start_index: int, end_index: int) -> Generator[int, None, None]:
acc = 1 << start_index
for _ in range(start_index, end_index + 1):
yield acc
acc <<= 1
def parse_out_bits(bit_field: int, start_index: int, end_index: int) -> int:
mask = sum(bit_place_values(start_index, end_index))
return (mask & bit_field) >> start_index发布于 2020-06-03 00:20:18
这不是你应该循环的那种东西。只需计算一个掩码:
def parse_out_bits(bit_field: int, start_index: int, end_index: int) -> int:
mask = (1 << (end_index - start_index + 1)) - 1
return (bit_field >> start_index) & mask英文本:
https://codereview.stackexchange.com/questions/243289
复制相似问题