我有一个64位十六进制数输入到我的脚本中 的 0x0000040800000000 即可。我想取这个数字并提取第39:32位。
这怎么可能?我一直在解析字符串的各个部分,并且最终陷入混乱。
我最初将它转换为二进制文件并从
中解析出字符串的各个部分def connected? (connection_table, model1, model2)
connection_table.class.find_by(model1, model2)
end
答案 0 :(得分:3)
您只需要先将十六进制字符串转换为整数,然后使用常规数学来提取位。
位编号通常从最低有效位开始,即以二进制显示时最右边的位为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 "As hex: 0x%X" % number
print
print "Bits 39-32: xxxxxxxx"
print " As binary: {:0>64s}".format(bin(number)[2:])
print " Mask: {:0>64s}".format(bin(mask_39_to_32)[2:])
print "AND result: {:0>64s}".format(bin(number & mask_39_to_32)[2:])
print " Shifted: {:0>64s}".format(bin((number & mask_39_to_32) >> 32)[2:])
print " As an int: {:d}".format((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的维基百科文章应该可以帮助您理解这个过程。