首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从位字段中解析出一个位序列

从位字段中解析出一个位序列
EN

Code Review用户
提问于 2020-06-03 00:04:48
回答 1查看 754关注 0票数 7

对于家庭作业,我必须用C解析CPUID指令输出,这需要很多特定的位操作,例如:

代码语言:javascript
复制
(eax & CACHE_LEVEL) >> 5

我计算了面罩CACHE_LEVEL和需要用手正确移动的数量。这很痛苦,所以我决定编写几个Python函数来帮助解决这个问题。

例如:

代码语言:javascript
复制
>>> 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如下所示,我希望从SE的位的值:

代码语言:javascript
复制
                        E S
100 0000 0000 0100 0001 0010 0001‬

我想要在这里的任何笔记,但特别是如何可以做得更好,在比特操作。

代码语言:javascript
复制
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
EN

回答 1

Code Review用户

回答已采纳

发布于 2020-06-03 00:20:18

这不是你应该循环的那种东西。只需计算一个掩码:

代码语言:javascript
复制
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

英文本:

  • 如果你得到5-7位,那是3位
  • 2^3 == 8,-1=7(或二进制数为111 -这是您的掩码)
  • 将字段右移5,将感兴趣的位置于最不重要的位置。
  • 然后-掩盖他们以得到结果。
票数 8
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/243289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档