【问题标题】:From hexadecimal to one's complement in PythonPython中从十六进制到补码
【发布时间】:2012-11-21 12:02:52
【问题描述】:

有没有简单的方法在 python 中产生一个补码?

例如,如果你取十六进制值0x9E,我需要将其转换为0x61

我需要将二进制 1 换成 0,将 0 换成 1。感觉应该很简单吧。

【问题讨论】:

    标签: python bit-manipulation ones-complement


    【解决方案1】:

    只需对 0xFF 使用the XOR operator ^

    >>> hex(0x9E ^ 0xFF)
    '0x61'
    

    如果您需要处理大于一个字节的值,您可以在您的值上从 int.bit_length() method 创建掩码:

    >>> value = 0x9E
    >>> mask = (1 << value.bit_length()) - 1
    >>> hex(value ^ mask)
    '0x61'
    >>> value = 0x9E9E
    >>> mask = (1 << value.bit_length()) - 1
    >>> hex(value ^ mask)
    '0x6161'
    

    【讨论】:

    • 好吧,我很困惑,为什么~x 错了?毕竟它应该是二元否定运算符。当涉及二进制操作时,我无法理解缺乏有符号/无符号的区别
    • @Kos: ~ 字面上返回 -(x+1),这在处理有符号值时非常有用。所以~0x9E-159,或者-0x9f 十六进制。对于无符号的按位工作,不是很好..
    • 好的,我明白了,Python 的“负数前面的 1 的概念上无限的字符串”方法让我头疼。与 C 位运算的类比在这里不起作用:(
    • @aka.nice:当然,这行得通(我按位或意外使用了|)。不过,您仍然需要创建遮罩。
    【解决方案2】:

    哈。刚刚发现pythonbin()返回一个字符串!

    这样我们就可以玩得开心了!

    for x in numbers: # numbers is a list of int
        b = bin(x)
        #print b # e.g. String 0b1011100101
        b = b.replace('0', 'x')
        b = b.replace('1', '0')
        b = b.replace('x', '1')
        b = b.replace('1b', '0b')
        #print b # String 0b0100011010
        print int(b, 2) # the decimal representation
    

    【讨论】:

    • 这刚刚进入我最实用的代码列表的前五名:)
    猜你喜欢
    • 2014-11-03
    • 2014-12-25
    • 1970-01-01
    • 2014-04-16
    • 2011-10-05
    • 2013-06-12
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多