我只能使用循环,而不能使用任何特殊的内置python库函数。 假设输入是0000000000000110,我想要的输出是1111111111111001。
我知道执行此操作的两种方法,但我不得不麻烦编程至少其中一种方法才能在python中工作。
第一种方法: 循环遍历所有数字,如果为0,则将其更改为1,如果为1,则将其更改为0。这是一个补数。这不是问题。 然后将1的基数2加到最右边的二进制位,并生成二进制补码。这种方法的问题是,如果需要携带1,则在对所有位进行加法时会携带1。
第二种方法(可能更简单): 从最右边的位开始循环遍历二进制数。在读取第一个前,请勿反转数字。一旦读取了1,就不要反转第一个1。但是要反转读取的第一个1的所有位(请记住,我从最右边的位开始遍历数字)。
简单的8位示例) 00000110 从最右边的位开始循环遍历数字 0(原始无变化) 1(与原始无变化) 0(与原版相反) 1(与原版相反) 1(与原版相反) 1(与原版相反) 1(与原版相反) 1(与原始版本相反)
我在python程序中实现方法的复杂性是,一旦读取1,我就有一个计数器加1。所以我说 如果i == 0或i == 1: 不要反转 如果我> 1: 反转
但是,从下面我给出的示例中可以看到一个小的问题。 例如) 1101 1个 0问题:(我仍然等于1) 0 0
当我想要获得: 1101 1个 1个 0 0
#second method
#input is a string
def twosComp(num) :
pile = ""
pile2 = ""
pile3 = ""
i = 0
#reverses the order of the bits(i.e. first bit in num is the last bit in
#pile)
for bit in num :
pile = bit + pile
print pile
#SUPPOSED TO DO THE TWO'S COMPLEMENT (BUT THE I COUNTER CAUSES A PROBLEM)
for bit in pile :
if bit == "1" :
i += 1
if i == 0 or i == 1 :
if bit == "0" :
pile2 = pile2 + "0"
elif bit == "1" :
pile2 = pile2 + "1"
elif i > 1 :
if bit == "0" :
pile2 = pile2 + "1"
elif bit == "1" :
pile2 = pile2 + "0"
#reverses the order of the bits back to the correct order
for bit in pile2 :
pile3 = bit + pile3
print pile3
#>>> twosComp("1101")
#1011
#0001
#pile3 the last output should be 0011
#method 1
def twosCompMOne(num) :
pile = ""
pile2 = ""
pile3 = ""
#reverses the order of the bits
for bit in num :
pile = bit + pile
print pile
#inverts all the bits in pile
for bit in pile :
if bit == "0" :
pile2 = pile2 + "1"
if bit == "1" :
pile2 = pile2 + "0"
#reverses the order of the bits back to the correct order
for bit in pile2 :
pile3 = bit + pile3
print pile3
#Now I don't know how to do the add 1 carrying by looping
答案 0 :(得分:1)
您拥有一般的主意。在此解决方案中,首先我们得到一个补码,然后按照您的期望将一个加到结果中。需要注意的是,在二进制数上加一个相对容易(即使以字符串表示)。
关键是要跟踪进位。将“ 1”添加到“ 0”后,就不必再携带了。我们将遵循基本步骤,而不是使用奇特的算法。
def invert(bin_string):
"""string -> string
return the string representation of inverting every bit of a binary number
represented by `bin_string`
"""
return "".join("0" if i == "1" else "1" for i in bin_string)
现在为实际2的补码
def twos_comp(bin_string):
"""string -> string
return a string representing the 2's complement of `bin_string`
"""
addendum = 1
res = ""
for i in invert(string)[::-1]:
if not addendum:
res = i + res
elif i == "0":
res = "1" + res
addendum = 0
else:
res = "0" + res
return res
具有以下定义:
>>> twos_comp("1101")
'0011'
>>> twos_comp("110110")
'001010'
符合预期