Двійкові числа в Python


81

Як я можу додавати, віднімати і порівнювати двійкові числа в Python без перетворення в десяткові?


1
Це питання домашнього завдання, тобто ви запитуєте, як робити математику на низькому рівні? Див. ( Stackoverflow.com/questions/1149929/… )
Том Лейс

1
Чи можете ви навести кілька прикладів того, чого ви намагаєтесь досягти?
John La Rooy

8
числа вже є двійковими в python. Вони перетворюються у двійкові, коли програма запускається, і перетворюються назад у десяткові лише тоді, коли ви використовуєте щось на зразок str () або print
John La Rooy

Відповіді:


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

В іншому випадку двійкові числа працюють точно так само, як десяткові числа, оскільки числа є числами, як би ви на них не дивились. Єдина різниця між десятковою та двійковою - це те, як ми представляємо ці дані, коли їх розглядаємо.


Завжди цікаво писати додавання, доповнення тощо за допомогою побітових операторів. Для всіх, кого це цікавить, шукайте посібники по схемах, точніше напівсуматори, потім повні суматори і, нарешті, субтрактор, можливо, навіть суматор-субстрактор. Звідси ви можете перевести його в побітові оператори.
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'))

Я залишаю функцію віднімання як вправу для читача.


-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, і додавання - це та сама логічна операція, незалежно від того, в якій базі ви працюєте.


Я думаю, ви неправильно інтерпретуєте те, що ставило питання. OP шукав спосіб читати / маніпулювати числами у двійковому поданні та змушувати їх взаємодіяти з числами у цілочисельному поданні.
Джош
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.