Binärzahlen in Python

79

Wie kann ich in Python Binärzahlen hinzufügen, subtrahieren und vergleichen, ohne sie in Dezimalzahlen umzuwandeln?

Martijn Pieters
quelle
1
Ist dies eine Hausaufgabenfrage, dh fragen Sie sich, wie man auf niedrigem Niveau Mathe macht? Siehe ( stackoverflow.com/questions/1149929/… )
Tom Leys
1
Können Sie einige Beispiele dafür geben, was Sie erreichen wollen?
John La Rooy
8
Zahlen sind in Python bereits binär. Sie werden beim Start Ihres Programms in Binärdateien konvertiert und nur dann wieder in Dezimalzahlen konvertiert, wenn Sie etwas wie str () oder print verwenden
John La Rooy

Antworten:

138

Sie können mit bin () und int () zwischen einer Zeichenfolgendarstellung der Binärdatei konvertieren.

>>> bin(88)
'0b1011000'
>>> int('0b1011000', 2)
88
>>> 

>>> a=int('01100000', 2)
>>> b=int('00100110', 2)
>>> bin(a & b)
'0b100000'
>>> bin(a | b)
'0b1100110'
>>> bin(a ^ b)
'0b1000110'
John La Rooy
quelle
Vielen Dank. Ja, das ist eine Hausaufgabe. Die Zuweisung besagt, dass ich die Zahlen im 'Binärformat' belassen soll, wenn ich ._add, ._sub, ._gt, ._lt und ._eq ausführe. Ihr Beispiel oben scheint von bin nach int zu konvertieren. Ich bin mir nicht sicher, ob dies akzeptabel sein wird, aber ich sehe keinen anderen Weg als Ihr Beispiel.
7
Sie können auch das Binärliteral verwenden, wenn Sie Python 2.6 und höher verwenden. Anstelle von int('01100111',2)dir schreibst du 0b01100111zum Beispiel was ist 103.
Joschua
9

Ich denke, Sie sind verwirrt darüber, was Binär ist. Binär und Dezimal sind nur unterschiedliche Darstellungen einer Zahl - z. B. sind 101 Basis 2 und 5 Basis 10 dieselbe Zahl. Die Operationen Addieren, Subtrahieren und Vergleichen arbeiten mit Zahlen - 101 Basis 2 == 5 Basis 10 und Addition ist dieselbe logische Operation, unabhängig davon, in welcher Basis Sie arbeiten. Die Tatsache, dass Ihr Python-Interpreter Dinge möglicherweise intern als binär speichert, tut dies nicht Es hat keinen Einfluss darauf, wie Sie damit arbeiten. Wenn Sie einen ganzzahligen Typ haben, verwenden Sie einfach +, - usw.

Wenn Sie Zeichenfolgen mit Binärziffern haben, müssen Sie entweder Ihre eigene Implementierung schreiben oder diese mit der Funktion int (binaryString, 2) konvertieren.

Steven Schlansker
quelle
7

Wenn Sie über bitweise Operatoren sprechen, sind Sie auf der Suche nach:

~ Not
^ XOR
| Or
& And

Ansonsten funktionieren Binärzahlen genauso wie Dezimalzahlen, da Zahlen Zahlen sind, unabhängig davon, wie Sie sie betrachten. Der einzige Unterschied zwischen dezimal und binär besteht darin, wie wir diese Daten darstellen, wenn wir sie betrachten.

Smashery
quelle
Es macht immer Spaß, add, sub usw. mit bitweisen Operatoren zu schreiben. Wenn Sie daran interessiert sind, suchen Sie nach Anleitungen für Schaltkreise, insbesondere Halbaddierer, dann Volladdierer und schließlich Subtrahierer, vielleicht sogar einen Addierer-Subtrahierer. Von hier aus können Sie es in bitweise Operatoren übersetzen.
Horse SMith
3

Binär, Dezimal, Hexadezimal ... die Basis ist nur beim Lesen oder Ausgeben von Zahlen von Bedeutung. Das Hinzufügen von Binärzahlen ist genau das gleiche wie das Hinzufügen von Dezimalzahlen: Es ist nur eine Frage der Darstellung.

Pierre Bourdon
quelle
0

Unten finden Sie ein Umschreiben einer zuvor veröffentlichten Funktion:

def addBinary(a, b): # Example: a = '11' + b =' 100' returns as '111'.    
    for ch in a: assert ch in {'0','1'}, 'bad digit: ' + ch    
    for ch in b: assert ch in {'0','1'}, 'bad digit: ' + ch    
    sumx = int(a, 2) + int(b, 2)    
    return bin(sumx)[2:]
mastueben
quelle
0
'''
I expect the intent behind this assignment was to work in binary string format.
This is absolutely doable.
'''

def compare(bin1, bin2):
    return bin1.lstrip('0') == bin2.lstrip('0')

def add(bin1, bin2):
    result = ''
    blen = max((len(bin1), len(bin2))) + 1
    bin1, bin2 = bin1.zfill(blen), bin2.zfill(blen)
    carry_s = '0'
    for b1, b2 in list(zip(bin1, bin2))[::-1]:
        count = (carry_s, b1, b2).count('1')
        carry_s = '1' if count >= 2 else '0'
        result += '1' if count % 2 else '0'
    return result[::-1]

if __name__ == '__main__':
    print(add('101', '100'))

Ich überlasse die Subtraktionsfunktion als Übung für den Leser.

Gary02127
quelle
-1

Ich bin mir nicht sicher, ob es hilfreich ist, aber ich lasse meine Lösung hier:

class Solution:
    # @param A : string
    # @param B : string
    # @return a strings
    def addBinary(self, A, B):
        num1 = bin(int(A, 2))
        num2 = bin(int(B, 2))
        bin_str = bin(int(num1, 2)+int(num2, 2))
        b_index = bin_str.index('b')
        return bin_str[b_index+1:]

s = Solution()
print(s.addBinary("11", "100"))
Mona Jalal
quelle
-4

x = x + 1 Druck (x) a = x + 5 Druck (a)

user9491697
quelle
-5

Ich denke, Sie sind verwirrt darüber, was Binär ist. Binär und Dezimal sind nur unterschiedliche Darstellungen einer Zahl - z. B. sind 101 Basis 2 und 5 Basis 10 dieselbe Zahl. Die Operationen Addieren, Subtrahieren und Vergleichen arbeiten mit Zahlen - 101 Basis 2 == 5 Basis 10 und Addition ist dieselbe logische Operation, unabhängig davon, in welcher Basis Sie arbeiten.

user5554869
quelle