

半加算と全加算を用いた２進数の計算を行いたいのですが,最後のwhile構文から下でエラーが表示され処理が進みません。どなたかご教示お願いします

**エラーメッセージ:**

[code]

    TypeError                                 Traceback (most recent call last)
    <ipython-input-30-1544c3673a72> in <module>
         39 goukei = ""
         40 while k >= 0:
    ---> 41   ha = int(a(k))
         42   fa = int(b(k))
         43   A,keta = fa(a,b,x)
    TypeError: 'str' object is not callable
    
[/code]

**コード:**

[code]

    from traitlets.config.application import logging
    def AND(a,b):
      A = a * b
      return A
     
    def OR(a,b):
       if a==1:
         if b==1:
            A=1
         else:
            A=0
    
    def NOT(a):
      if a==1:
        A=0
      if a==0:
        A=1
      return A
    
    def ha(a,b):
        A1 = OR(a,b)
        keta = AND(a,b)
        A2 = NOT(keta)
        A = AND(A1,A2)
        return A,keta
    
    def fa(a,b,x):
      A1,keta1 = ha(a,b)
      A,keta2 = ha(A1,x)
      keta = OR(keta1,keta2)
      return A,keta
    
    a = input("2進数の数字")
    b = input("2進数に足す方")
    k = len(a)
    k = k - 1
    x = 0
    goukei = ""
    while k >= 0:
      ha = int(a(k))
      fa = int(b(k))
      A,keta = fa(a,b,x)
      goukei = str(A) + goukei
      x = keta
      k = k - 1
      goukei = str(x) + goukei
      print(a,"+",b,"=",goukei)
    
[/code]


CC BY-SA 4.0
2022-11-09T12:35:25.587
92111
2022-11-10T16:03:33.753
2022-11-10T12:17:26.190
3060
55303
question
python
whileの中でTypeErrorが出て処理が進まないのを解決したい


処理全体としては, 大きく 3箇所ほどの間違いがあり

  1. `OR` 関数が結果を返していない。そもそも判定が間違ってそう
  2. bit 文字列から要素取り出す指定が違う (後述)
  3. (元の記述のままのはずだが) インデントが違う。`goukei = str(x) + goukei` 以下はループの外のはず

要素の取り出し部分

[code]

    while k >= 0:
      ha = int(a(k))
      fa = int(b(k))
      A,keta = fa(a,b,x)
    
[/code]

取り出すなら **`a[k]`** , **`b[k]`** のはずで

  * `ha`, `fa` は関数名として使用しているので上書きしてしまう。別の変数名にすべき
  * 関数 `fa` に指定する値は, `a`, `b` ではなく, 直前の「取り出した値」のはず


CC BY-SA 4.0
2022-11-09T14:59:55.827
92114
2022-11-09T14:59:55.827
43025
92111
answer


既に回答された方の指摘の修正と `a` と `b` の桁数が異なる場合でも計算できるようにしました。なお，`0`
で埋めて同じ桁数にしてから計算する方法もあります。

[code]

    def AND(x, y):
        return 1 if x and y else 0
    
    def OR(x, y):
        return 1 if x or y else 0
    
    def NOT(x):
        return 1 if not x else 0
    
    def ha(x, y):
        K = AND(x, y)
        A = AND(OR(x, y), NOT(K))
        return A, K
    
    def fa(x, y, z):
        A1, K1 = ha(x, y)
        A2, K2 = ha(A1, z)
        K3 = OR(K1, K2)
        return A2, K3
    
    
    a = input("2進数a: ")
    b = input("2進数b: ")
    
    k, m = len(a), len(b)
    keta = 0
    goukei = ''
    while k > 0 or m > 0:
        k, m = k - 1, m - 1
        na = 0 if k < 0 else int(a[k])
        nb = 0 if m < 0 else int(b[m])
        ns, keta = fa(na, nb, keta)
        goukei = str(ns) + goukei
    
    goukei = ('1' if keta else '') + goukei
    print(f'{a} + {b} = {goukei}')
    
[/code]

[code]

    2進数a: 110011
    2進数b: 1110
    110011 + 1110 = 1000001
    
[/code]


CC BY-SA 4.0
2022-11-10T16:03:33.753
92135
2022-11-10T16:03:33.753
54588
92111
answer