用Python编写16位二进制正数的二进制补码

时间:2018-11-27 02:11:53

标签: python

我只能使用循环,而不能使用任何特殊的内置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  

1 个答案:

答案 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'

符合预期