从 Python 中的十六进制数解析位偏移量

Parsing out bit offsets from a hex number in Python

我有一个 64 位十六进制数输入到我的脚本中 0x0000040800000000。我想取这个数字并提取位 39:32.

这怎么可能?我一直在解析字符串的各个部分,结果一团糟。

我最初是将它转换成二进制并从

中解析出字符串的各个部分
command_register =  "".join(["{0:04b}".format(int(c,16)) for c in str(command_register)])

您只需要先将十六进制字符串转换为整数,然后使用普通数学来提取位。

位编号通常从最低有效位开始,即以二进制显示时最右边的位是位 0。因此要提取位 39:32(8 个连续位),您只需要一个掩码0xFF00000000。简单地与您的数字并将结果向右移动 32 位。

使用您的十六进制值并提取位 39 到 32 将为您提供值 0x08。以下脚本向您展示了如何操作:

hex_string = "0x0000040800000000"
number = int(hex_string, 16)    # Convert to an integer
mask_39_to_32 = 0xFF00000000    # Suitable mask to extract the bits with

print(f"As hex: 0x{number:X}")
print()
print("Bits 39-32:                         xxxxxxxx")
print(f" As binary: {bin(number)[2:]:0>64s}")
print(f"      Mask: {bin(mask_39_to_32)[2:]:0>64s}")
print(f"AND result: {bin(number & mask_39_to_32)[2:]:0>64s}")
print(f"   Shifted: {bin((number & mask_39_to_32) >> 32)[2:]:0>64s}")
print(f" As an int: {(number & mask_39_to_32) >> 32}")

显示以下输出:

As hex: 0x40800000000

Bits 39-32:                         xxxxxxxx
 As binary: 0000000000000000000001000000100000000000000000000000000000000000
      Mask: 0000000000000000000000001111111100000000000000000000000000000000
AND result: 0000000000000000000000000000100000000000000000000000000000000000
   Shifted: 0000000000000000000000000000000000000000000000000000000000001000
 As an int: 8

47 到 40 所需的掩码为:

Bits 47-40:                 xxxxxxxx
 As binary: 0000000000000000111111110000000000000000000000000000000000000000
    As hex: 0xFF0000000000

十六进制的使用只是让它不那么冗长,一旦你习惯了它就会更清晰。掩码的 8 位组总是以 'FF'.

结尾

bitwise operations 上的维基百科文章应该可以帮助您理解该过程。