как использовать base2 в математике - PullRequest
0 голосов
/ 29 мая 2018

У меня есть список значений base2 (5 цифр каждое):

[10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111]

Есть ли способ сделать математику с ними в base2?Например, 10001 + 1110 = 11111

И 10000 - 1 = 1111.

РЕДАКТИРОВАТЬ: я забочусь только о сложении и вычитании.

Ответы [ 6 ]

0 голосов
/ 29 мая 2018

@ Naji , взгляните на приведенные ниже примеры кода.

Вы можете использовать int () и bin () функционирует несколько раз для достижения вашей цели.

a = 10000
b = 1

# Base 2 addition
result1 = (bin( int(str(a), 2) - int(str(b), 2) )[2:] # 1111

# Base 2 subtraction
result2 = bin( int(str(a), 2) + int(str(b), 2) )[2:]  # 10001

"Попробуйте на интерактивной консоли Python

>>> # Base 2 subtraction & addition 
...
>>> a = 10000
>>> b = 1
>>>
>>> result = bin( int(str(a), 2) - int(str(b), 2) )
>>> result
'0b1111'
>>>
>>> result = bin( int(str(a), 2) + int(str(b), 2) )
>>> result
'0b10001'
>>>
>>> result = bin( int(str(a), 2) - int(str(b), 2) )[2:]
>>> result
'1111'
>>>
>>> result = bin( int(str(a), 2) + int(str(b), 2) )[2:]
>>> result
'10001'
>>>

Попробуем добавить все двоичные числа, которые вы указалив задаче.

>>> binaries = [10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111]
>>>
>>> decimals = [int(str(binary), 2) for binary in binaries]
>>> decimals
[16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]
>>>
>>> sum(decimals)
376
>>>
>>> bin(sum(decimals))
'0b101111000'
>>>
>>> bin(sum(decimals))[2:]
'101111000'
>>>

Наконец, мы можем разработать нашу собственную функцию, которая будет приводить к точной бинарной строке (т. е. без 0b с добавлением, как в 0b1111) после сложения или вычитания.

# ********* BASE2 ADDITION ***************
def base2_addition(a, b):
    try:
        int_a = int(str(a), 2) 
        int_b = int(str(b), 2) 

        return bin(int_a + int_b)[2:] 
    except:
        print ("Invalid input provided (Expected 2 binary strings/numbers with 0s and 1s")
        return None

print base2_addition('10000', '1')   # 10001
print base2_addition('10001', '011') # 10100

# ********* BASE2 SUBTRACTION **************
def base2_subtraction(a, b):
    try:
        int_a = int(str(a), 2) 
        int_b = int(str(b), 2) 

        return bin(int_a - int_b)[2:] 
    except:
        print ("Invalid input provided (Expected 2 binary strings/numbers with 0s and 1s")
        return None

print(base2_subtraction('10100', '101')) # 1111
0 голосов
/ 29 мая 2018

В соответствии с int строкой документа, требуется int или long тип данных

Docstring:
int(x=0) -> int or long
int(x, base=10) -> int or long

И bin занимает str:

Docstring:
bin(number) -> string

Так как вашсписок имеет base10 вместо base2, он не самый красивый и не самый быстрый, я бы преобразовал ваш список base10 в тип base2 посредством приведения и выполнил бы математические расчеты.Поскольку вы упомянули, что вы заботитесь только о вычитании или сложении, я добавил переменную X, чтобы контролировать ваше вычитание или сложение.

ПРИМЕЧАНИЕ : Я предполагаю, что переменная X здесь принимает base2 отформатировано string или int, поэтому для вас не составит труда указать значение X = '1000' или X = 1000.Выдает исключение ValueError, если вы вводите любое число, которое больше или равно 2, например: X = 1112 или X = 16

nums = [10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111]    
nums_string = [str(num) for num in nums]

X = 1
nums_sum = [bin(int(num, base=2) + int(str(X), base=2)) for num in nums_string]
nums_sum

['0b10001',
 '0b10010',
 '0b10011',
 '0b10100',
 '0b10101',
 '0b10110',
 '0b10111',
 '0b11000',
 '0b11001',
 '0b11010',
 '0b11011',
 '0b11100',
 '0b11101',
 '0b11110',
 '0b11111',
 '0b100000']

X = -1
nums_sum = [bin(int(num, base=2) + int(str(X), base=2)) for num in nums_string]
nums_sum
['0b1111',
 '0b10000',
 '0b10001',
 '0b10010',
 '0b10011',
 '0b10100',
 '0b10101',
 '0b10110',
 '0b10111',
 '0b11000',
 '0b11001',
 '0b11010',
 '0b11011',
 '0b11100',
 '0b11101',
 '0b11110']

X = -10000
nums_sum = [bin(int(num, base=2) + int(str(X), base=2)) for num in nums_string]
nums_sum
['0b0',
 '0b1',
 '0b10',
 '0b11',
 '0b100',
 '0b101',
 '0b110',
 '0b111',
 '0b1000',
 '0b1001',
 '0b1010',
 '0b1011',
 '0b1100',
 '0b1101',
 '0b1110',
 '0b1111']

X = '-10000'
nums_sum = [bin(int(num, base=2) + int(str(X), base=2)) for num in nums_string]
nums_sum
['0b0',
 '0b1',
 '0b10',
 '0b11',
 '0b100',
 '0b101',
 '0b110',
 '0b111',
 '0b1000',
 '0b1001',
 '0b1010',
 '0b1011',
 '0b1100',
 '0b1101',
 '0b1110',
 '0b1111']

X = '-11111'
nums_sum = [bin(int(num, base=2) + int(str(X), base=2)) for num in nums_string]
nums_sum
'-0b1111',
'-0b1110',
'-0b1101',
'-0b1100',
'-0b1011',
'-0b1010',
'-0b1001',
'-0b1000',
'-0b111',
'-0b110',
'-0b101',
'-0b100',
'-0b11',
'-0b10',
'-0b1',
'0b0']

В зависимости от операций, которые вы хотите автоматизировать, коддля выполнения зависит.

0 голосов
/ 29 мая 2018

По умолчанию любое число, которое вы пишете, находится в базе 10. Таким образом, когда вы ввели 10000, вы на самом деле написали число десять тысяч .

Ввод числа в двоичном виде

Если вы хотите указать, что вы пишете число в двоичном формате, используйте префикс 0b.

>>> 0b10000
16

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

def decimal_notation_to_binary(x):
    return int(str(x), 2)

Пример:

>>> decimal_notation_to_binary(10000)
16

Получение двоичного представления числа

В качестве альтернативы, если вам нужно двоичное представление числа, используйте встроенную функцию bin.

>>> bin(42)
'0b101010'

Арифметика

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

>>> 0b10000 + 0b1000
24

Фактически, в качестве доказательства того, что основа, в которую вы вводите число, не имеет значения, выМожно даже добавить двоичное, десятичное и шестнадцатеричное число.

>>> 0b100 + 0x1f + 7
42
0 голосов
/ 29 мая 2018

Предполагая, что вы хотите обработать эти int числа как двоичные числа, вам сначала нужно преобразовать их в двоичные:

In []:
lst = [10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111]
blst = [int(str(n), 2) for n in lst]
print(blst)

Out[]:
[16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]

По умолчанию int s - это печать базы 10, поэтому 0b10000 равен 16 в базе 10. Даже при использовании двоичных литералов, например:

In []:
[0b10000, 0b10001, 0b10010, 0b10011, 0b10100, 0b10101]

Out[]:
[16, 17, 18, 19, 20, 21]

Вы можете распечатать их как двоичные с помощью:

In []:
print(' '.join(format(n, 'b') for n in blst))

Out[]:
10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111

Вы можете добавлять и удалять эти значенияи до тех пор, пока вы распечатываете их в двоичном виде, все будет так, как вы ожидаете, например, вычитаете 0b1 из всех них:

In []:
print(' '.join(format(n - 0b1, 'b') for n in blst))

Out[]:
1111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110

и добавляете 0b1110:

In []:
print(' '.join(format(n + 0b1110, 'b') for n in blst))

Out[]:
11110 11111 100000 100001 100010 100011 100100 100101 100110 100111 101000 101001 101010 101011 101100 101101
0 голосов
/ 29 мая 2018

Те числа, с которыми вы работаете, являются базовыми 10 представлениями.Вы можете использовать префикс 0b, чтобы сделать его основанием 2 ex 0b10001 + 0b1110, что равно 31 (0b11111).

0 голосов
/ 29 мая 2018

Вы можете преобразовать в int, выполнить операцию, а затем преобразовать обратно в двоичный файл.
Например:

print (bin (int ('1001', base = 2) + int ('1011)', base = 2)) [2:])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...