Двоичные числа в Python

81

Как я могу складывать, вычитать и сравнивать двоичные числа в Python без преобразования в десятичные?

Мартейн Питерс
источник
1
Это вопрос домашнего задания, то есть вы спрашиваете, как выполнять математику на низком уровне? См. ( Stackoverflow.com/questions/1149929/… )
Том Лейс
1
Вы можете привести несколько примеров того, чего пытаетесь достичь?
Джон Ла Рой,
8
числа в Python уже являются двоичными. Они преобразуются в двоичный код при запуске вашей программы и преобразуются обратно в десятичный только тогда, когда вы используете что-то вроде str () или print
Джон Ла Рой,

Ответы:

142

Вы можете преобразовать строковое представление двоичного файла с помощью bin () и 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'
Джон Ла Рой
источник
Спасибо. Да, это домашнее задание. В назначении указано, что я должен оставлять числа в «двоичном формате» при выполнении ._add, ._sub, ._gt, ._lt и ._eq. Ваш пример выше, похоже, преобразуется из bin в int. Я не уверен, будет ли это приемлемо, но я не вижу другого выхода, кроме вашего примера.
7
Вы также можете использовать двоичный литерал при использовании Python 2.6 и выше. Вместо того, int('01100111',2)чтобы писать 0b01100111например, что есть 103.
Джошуа
9

Я думаю, вы не понимаете, что такое двоичный файл. Двоичное и десятичное - это просто разные представления числа - например, 101 с основанием 2 и 5 с основанием 10 - это одно и то же число. Операции сложения, вычитания и сравнения работают с числами - 101 база 2 == 5 основание 10, а сложение - это одна и та же логическая операция независимо от того, на какой базе вы работаете. Тот факт, что ваш интерпретатор python может хранить вещи как двоичные внутри, не не влияет на то, как вы с ним работаете - если у вас целочисленный тип, просто используйте +, - и т. д.

Если у вас есть строки двоичных цифр, вам придется либо написать свою собственную реализацию, либо преобразовать их с помощью функции int (binaryString, 2).

Стивен Шланскер
источник
7

Если вы говорите о побитовых операторах, то вам нужно:

~ Not
^ XOR
| Or
& And

В остальном двоичные числа работают точно так же, как десятичные числа, потому что числа - это числа, как бы вы на них ни смотрели. Единственная разница между десятичным и двоичным числами заключается в том, как мы представляем эти данные, когда смотрим на них.

Smashery
источник
Всегда интересно писать add, sub и т. Д. С помощью побитовых операторов. Для всех, кто интересуется этим, поищите руководства по схемам, в частности, полусумматоры, затем полные сумматоры и, наконец, вычитатель, может быть, даже сумматор-вычитатель. Отсюда вы можете перевести его в побитовые операторы.
Horse SMith
3

Двоичное, десятичное, шестнадцатеричное ... основание имеет значение только при чтении или выводе чисел, добавление двоичных чисел ничем не отличается от добавления десятичного числа: это просто вопрос представления.

Пьер Бурдон
источник
0

Ниже приводится перезапись ранее опубликованной функции:

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

Я оставляю функцию вычитания в качестве упражнения для читателя.

Gary02127
источник
-1

Не уверен, что это поможет, но я оставляю свое решение здесь:

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

Я думаю, вы не понимаете, что такое двоичный файл. Двоичное и десятичное - это просто разные представления числа - например, 101 с основанием 2 и 5 с основанием 10 - это одно и то же число. Операции сложения, вычитания и сравнения работают с числами - 101 основание 2 == 5 основание 10, а сложение - это одна и та же логическая операция, независимо от того, с какой базой вы работаете.

user5554869
источник
Я думаю, вы неправильно истолковываете вопрос. OP искал способ читать / управлять числами в двоичном представлении и заставить их взаимодействовать с числами в целочисленном представлении.
Джош