2024-10-05 17:26:20 发布
网友
我有一个十六进制字符串f6befc34e3de2d30。我想把它转换成有符号的long long,但是
f6befc34e3de2d30
x['id'], = struct.unpack('>q', 'f6befc34e3de2d30'.decode('hex'))
给出:
预期的。在
谢谢!在
你可以做long('f6befc34e3de2d30', 16)
long('f6befc34e3de2d30', 16)
bin(long('f6befc34e3de2d30', 16)) >>> '0b1111011010111110111111000011010011100011110111100010110100110000'
编辑:跟进@Paul Panzer的评论。对于基于ALU硬件的C类型的long实现,这是正确的。您不能有符号的整数大于2^63。但是,Python的实现不同,它依赖于大数的数组表示和Karatsuba算法进行算术运算。这就是为什么这个方法有效。在
编辑2:以下是OPs问题。不存在“第一位作为标志”的问题。在您的问题中,您明确希望使用Python的long构造,对于这种结构,它的实现并不是您所期望的那样,它使用的表示与您可能熟悉的C中的表示不同,而是将大整数表示为一个数组。所以如果你想实现某种第一位逻辑,你必须自己去做。我没有这方面的文化和经验,所以下面的内容可能会完全错误,因为有人知道他的东西,但还是让我给你我的看法。在
我看到了两种方法。在第一种方法中,您同意要使用的最长时间的约定,然后实现与ALU相同的逻辑。让我们假设为了便于讨论,我们希望使用[-2^127, 2^127-1]范围内的符号long。我们可以做以下事情
[-2^127, 2^127-1]
对于第二种方法,您不认为存在MAX_LONG,但第一位始终是符号位。然后您必须修改上面的parse_nb方法。我把它作为练习:)。在
parse_nb
你可以做
long('f6befc34e3de2d30', 16)
编辑:跟进@Paul Panzer的评论。对于基于ALU硬件的C类型的long实现,这是正确的。您不能有符号的整数大于2^63。但是,Python的实现不同,它依赖于大数的数组表示和Karatsuba算法进行算术运算。这就是为什么这个方法有效。在
编辑2:以下是OPs问题。不存在“第一位作为标志”的问题。在您的问题中,您明确希望使用Python的long构造,对于这种结构,它的实现并不是您所期望的那样,它使用的表示与您可能熟悉的C中的表示不同,而是将大整数表示为一个数组。所以如果你想实现某种第一位逻辑,你必须自己去做。我没有这方面的文化和经验,所以下面的内容可能会完全错误,因为有人知道他的东西,但还是让我给你我的看法。在
我看到了两种方法。在第一种方法中,您同意要使用的最长时间的约定,然后实现与ALU相同的逻辑。让我们假设为了便于讨论,我们希望使用
^{pr2}$[-2^127, 2^127-1]
范围内的符号long。我们可以做以下事情对于第二种方法,您不认为存在MAX_LONG,但第一位始终是符号位。然后您必须修改上面的
parse_nb
方法。我把它作为练习:)。在相关问题 更多 >
编程相关推荐