【问题标题】:How to print a signed integer as hexadecimal number in two's complement with python?python - 如何使用python在二进制补码中将有符号整数打印为十六进制数?
【发布时间】:2011-03-15 05:05:34
【问题描述】:

我有一个负整数(4 个字节),我希望得到它的二进制补码表示的十六进制形式。

>>> i = int("-312367")
>>> "{0}".format(i)
'-312367'
>>> "{0:x}".format(i)
'-4c42f'

但我想看“FF...”

【问题讨论】:

  • '二进制补码表示的十六进制形式' ?这至少有什么帮助?
  • 查看相关问题的答案是否是您正在寻找的:stackoverflow.com/questions/1604464/twos-complement-in-python/…
  • 康拉德,也许他正在准备一个工具来向他的学生展示它是如何完成的。或者他很好奇。或者他有一个 API 可以遵循。或者一个朋友和他打赌 Perl 可以做得更好的一箱啤酒。
  • 是的,位串十六进制属性似乎也返回了我需要的东西。谢谢。
  • @Konrad,1:不,为什么? @Konrad,2:对不起,如果你不清楚我的意思——你会怎么说?

标签: python integer hex signed twos-complement


【解决方案1】:
>>> x = -123
>>> bits = 16
>>> hex((1 << bits) + x)
'0xff85'
>>> bits = 32
>>> hex((1 << bits) + x)
'0xffffff85'

【讨论】:

  • 对于123,16位2的补码表示不是0x007b吗? 0xff85 表示 -123。
  • @dcoles,没有 123 的总和,它的 2 的补码应该是 0(进位/溢出位被丢弃)不管你想把 0xff85 视为有符号还是无符号。
  • 我同意 0x007b 的 2 的补码(二进制数的运算)是 0xff85,但我认为问题是关于 2 的补码有符号数表示。
  • @dcoles,啊。我想我明白你在说什么。如果我让x = -123 可能会更清楚
【解决方案2】:

要将整数视为二进制值,请按位并使用所需位长的掩码。

例如,对于一个 4 字节的值(32 位),我们使用 0xffffffff 进行掩码:

>>> format(-1 & 0xffffffff, "08X")
'FFFFFFFF'
>>> format(1 & 0xffffffff, "08X")
'00000001'
>>> format(123 & 0xffffffff, "08X")
'0000007B'
>>> format(-312367 & 0xffffffff, "08X")
'FFFB3BD1'

【讨论】:

    【解决方案3】:

    简单

    >>> hex((-4) & 0xFF)
    '0xfc'
    

    【讨论】:

      【解决方案4】:

      使用bitstring 模块:

      >>> bitstring.BitArray('int:32=-312367').hex
      '0xfffb3bd1'
      

      【讨论】:

        【解决方案5】:

        这是一种方法(适用于 16 位数字):

        >>> x=-123
        >>> hex(((abs(x) ^ 0xffff) + 1) & 0xffff)
        '0xff85'
        

        (虽然可能不是最优雅的方式)

        【讨论】:

        • 这不适用于正数。如果 x=1,您将得到 0xffff(16 位二进制补码中的 -1),而不是 0x0001
        • 给出的例子是一个负整数,但问题是“如何在二进制补码 [re​​presentation] 中打印一个有符号整数...”。如果此答案仅适用于负符号整数,可能会令人困惑。
        【解决方案6】:

        struct 模块执行 Python 值和表示为 Python 字节对象的 C 结构之间的转换。打包字节对象提供对单个字节值的访问。 这可用于显示底层 (C) 整数表示。

        >>> packed = struct.pack('>i',i) # big-endian integer
        >>> type(packed)
        <class 'bytes'>
        >>> packed
        b'\xff\xfb;\xd1'
        >>> "%X%X%X%X" % tuple(packed)
        'FFFB3BD1'
        >>> 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-25
          • 2011-09-03
          • 1970-01-01
          • 2022-11-29
          • 2012-02-24
          • 2021-01-23
          • 2020-04-29
          • 1970-01-01
          相关资源
          最近更新 更多