我试图在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
7条答案
按热度按时间hjzp0vay1#
由于其他答案涵盖了您的主要问题,您也可以只使用字典将
1
Map到0
,反之亦然:icomxhvb2#
所以我想自己找到一个数的二进制补码,但是不满意掩码是如何生成的,还有其他的东西,因为它们涉及到使用二进制数的字符串表示。
所以我深入挖掘了一下,发现了这个reddit post,他们通过逐位移位生成了掩码。
我还发现你可以用
int.bit_lenght(<your_number>)
来计算整数的位数,而不用len(bin(<your-number>)[2:])
,唯一的问题是:它对数字0返回0,所以你必须考虑到这一点。虽然我不知道与字符串操作相比,什么方法更有性能,是否值得。
但最后这是我的最终解决方案,我发现它很简洁,因为它不涉及字符串。
编辑:
2**bit_count - 1
是一种更快的方式Edit 2:如果你想取定长位数的补码。
例如:C_1(0001)-〉0001异或1111 = 1110,而不只是0000。
现在,您可以为掩码设置bit_count值,以使补码正确工作。
tpgth1q73#
你有一些问题。
首先,你没有正确地将输入转换成二进制字符串,这可以通过
numb = bin(num)[2:]
而不是num = str(num)
来完成。第二,你试图索引你的空
numb2
列表,实际上没有必要创建一个单独的numb2
列表,你可以直接操作你的numb
字符串,就像你第一次尝试的那样。例如:最后,要将二进制字符串转换回int,应该执行
int(numb, 2)
而不是int(numb)
。mlnl4t2r4#
numb2
是一个空列表。它没有任何要寻址(和更新)的元素。您需要的是一个bytearray
,而不是一个list
(或string
):可以看出,这需要一些其他的小改动,因为
bytearray
中存储的数据是字节(0-255)而不是字符。解决方案是使用ord
函数,从"0"
和"1"
获取字节数。此外,还有一个小问题(减一)。由于索引和计数从零开始,i
应该严格小于字符串的长度。我还想补充一点,虽然有更简单的方法来实现0和/或1的补码。
rkttyhzu5#
假设我们必须找到
101
的补码,如果我们将输入与掩码111
进行异或,则我们将得到010
,它是补码。5us2dqdw6#
对于那些寻找一行程序的人,这里有一个:
上面的代码计算
numbits
位二进制数value
的1的补码:当然,我们可以将其转换为函数:
高温加热
zqdjd7g97#
你指的不是~运算符吗,例如: