从 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 上的维基百科文章应该可以帮助您理解该过程。
我有一个 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 上的维基百科文章应该可以帮助您理解该过程。