Números binarios en Python


81

¿Cómo puedo sumar, restar y comparar números binarios en Python sin convertirlos a decimales?


1
¿Es esta una pregunta de tarea, es decir, está preguntando cómo hacer matemáticas a un nivel bajo? Ver ( stackoverflow.com/questions/1149929/… )
Tom Leys

1
¿Puede dar algunos ejemplos de lo que está tratando de lograr?
John La Rooy

8
los números ya son binarios en Python. Se convierten a binarios cuando se inicia su programa y solo se vuelven a convertir a decimal cuando usa algo como str () o print
John La Rooy

Respuestas:


142

Puede convertir entre una representación de cadena del binario usando bin () e int ()

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

Gracias. Sí, esta es una tarea. La asignación establece que se supone que debo dejar los números en 'formato binario' al realizar ._add, ._sub, ._gt, ._lt y ._eq. Su ejemplo anterior parece convertirse de bin a int. No estoy seguro de si esto será aceptable, pero no veo ninguna otra forma de hacerlo, excepto su ejemplo.

7
También puede utilizar el literal binario cuando utilice Python 2.6 y superior. En lugar de int('01100111',2)escribir, 0b01100111por ejemplo, que es 103.
Joschua

9

Creo que estás confundido acerca de lo que es binario. El binario y el decimal son solo representaciones diferentes de un número; por ejemplo, 101 base 2 y 5 base 10 son el mismo número. Las operaciones sumar, restar y comparar operan en números - 101 base 2 == 5 base 10 y la suma es la misma operación lógica sin importar en qué base esté trabajando. El hecho de que su intérprete de Python pueda almacenar cosas como binario internamente no no afecta la forma en que trabaja con él: si tiene un tipo entero, simplemente use +, -, etc.

Si tiene cadenas de dígitos binarios, tendrá que escribir su propia implementación o convertirlas usando la función int (binaryString, 2).


7

Si está hablando de operadores bit a bit, entonces está buscando:

~ Not
^ XOR
| Or
& And

De lo contrario, los números binarios funcionan exactamente igual que los números decimales, porque los números son números, sin importar cómo se miren. La única diferencia entre decimal y binario es cómo representamos esos datos cuando los miramos.


Siempre es divertido escribir add, sub, etc. con operadores bit a bit. Para cualquier persona interesada en esto, busque guías sobre circuitos, más específicamente medios sumadores, luego sumadores completos y finalmente resta, tal vez incluso un sumador-sustractor. Desde aquí puede traducirlo a operadores bit a bit.
Horse SMith

3

Binario, decimal, hexadecimal ... la base solo importa al leer o sacar números, sumar números binarios es lo mismo que sumar números decimales: es solo una cuestión de representación.


0

A continuación se muestra una reescritura de una función publicada anteriormente:

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:]

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'))

Dejo la función de resta como ejercicio para el lector.


-1

No estoy seguro si es útil, pero dejo mi solución aquí:

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"))


-6

Creo que estás confundido acerca de lo que es binario. El binario y el decimal son solo representaciones diferentes de un número; por ejemplo, 101 base 2 y 5 base 10 son el mismo número. Las operaciones sumar, restar y comparar operan en números: 101 base 2 == 5 base 10 y la suma es la misma operación lógica sin importar en qué base esté trabajando.


Creo que estás malinterpretando lo que preguntaba. OP estaba buscando una forma de leer / manipular números en representación binaria y hacer que interactúen con números en una representación entera.
Josh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.