在Python中查找数字的补码

时间:2018-02-04 11:05:26

标签: python python-3.x

我试图在Python中找到一个数字的补码。我知道还有其他解决方案,但我正在努力创造自己的解决方案。 我的第一次尝试:

def findComplement(self, num):
    """
    :type num: int
    :rtype: int
    """
    numb = str(num)
    i = 0
    while(i<=len(numb)):
        if numb[i] == "0":
            numb[i] = "1"
        else:
            numb[i] = "0"
        i=i+1
    return int(numb)

但是字符串是不可变的所以它给出了一个错误, 我的第二次尝试:

def findComplement(self, num):
    """
    :type num: int
    :rtype: int
    """
    numb = str(num)
    numb2 = []
    k =0
    for j in numb:
        numb2[k] = j #error on this line
        k=k+1
    i = 0
    while(i<=len(numb2)):
        if numb2[i] == "0":
            numb2[i] = "1"
        else:
            numb2[i] = "0"
        i=i+1
    return int(numb2)

程序2中的错误:

Line 11: IndexError: list assignment index out of range

4 个答案:

答案 0 :(得分:0)

numb2是一个空列表。它没有任何要处理(和更新)的元素。您需要的是bytearray,而不是list(或string):

def findComplement(self, num):
    """
    :type num: int
    :rtype: int
    """
    numb = bytearray(str(num), 'utf-8')
    i = 0
    while(i<len(numb)):
        if numb[i] == ord("0"):
            numb[i] = ord("1")
        else:
            numb[i] = ord("0")
        i=i+1
    return int(numb)

可以看出,这需要进行一些小的其他更改,因为bytearray中的存储数据是一个字节(0-255)而不是char。解决方案是使用ord函数来获取"0""1"的字节数。此外,while表达式中存在一个小问题(逐个关闭)。由于索引和您的计数从零开始i应该严格小于字符串的长度。

我还想补充说,尽管如此,还是有简单的方法可以实现0和/或1的补充。

答案 1 :(得分:0)

你有一些问题。

首先,您没有正确地将输入转换为二进制字符串。这可以通过Error (12) Need Expression 代替numb = bin(num)[2:]来完成。

其次,您正在尝试索引空num = str(num)列表。实际上,无需创建单独的numb2列表,您可以直接在numb2字符串上操作,就像您第一次尝试一样。例如:

numb

最后,要将二进制字符串转换回int,您应该for i in range(len(numb)): if numb[i] == "0": numb[i] = "1" else: numb[i] = "0" 而不是int(numb, 2)

答案 2 :(得分:0)

难道你不是指〜运算符,例如:

Transaction

答案 3 :(得分:0)

由于其他答案涵盖了您的主要问题,您还可以使用字典将1映射到0,反之亦然:

>>> d = {'0': '1', '1': '0'}
>>> s = '0101'
>>> ''.join(d[x] for x in s)
'1010'