我该如何对二进制数执行数学运算?

115

如何在Python中对二进制数进行加、减和比较,而不需要将它们转换为十进制?


3
这是一个作业问题吗?也就是说,您想知道如何在低级别上做数学吗?请参见(https://dev59.com/NnM_5IYBdhLWcg3w9oWG#1150996) - Tom Leys
2
你能给一些你想要实现的例子吗? - John La Rooy
10
Python中的数字已经是二进制的。它们在程序启动时被转换为二进制,只有在使用类似于str()或print的函数时才会被转换回十进制。 - John La Rooy
10个回答

186

你可以使用 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时应该保留数字的“二进制格式”。你上面的例子似乎是从二进制转换为整数。我不确定这是否可行,但我没有看到其他的方法除了你的例子。 - EkSwaim
13
在使用Python 2.6及以上版本时,您还可以使用二进制字面量。例如,将int('01100111',2)替换为0b01100111,它的值仍然是103。请注意,这种替换方法不会改变原始含义,同时使语句更加简洁易懂。 - Joschua

10

我认为你对二进制的概念有些混淆。二进制和十进制只是数字的不同表示法 - 比如说,基于2的101和基于10的5是相同的数字。加、减和比较操作都是对数字进行操作 - 基于2的101等于基于10的5,无论在哪种进制下进行加法操作都是相同的逻辑操作。即使你的Python解释器内部可能以二进制形式存储事物,这也不会影响你的使用方式 - 如果你有一个整数类型,就可以使用+、-等运算符。

如果你有二进制数字的字符串,你必须要自己编写实现或者使用int(binaryString, 2)函数进行转换。


9
如果你想讨论按位运算符,那么你需要用到以下内容:
~ Not
^ XOR
| Or
& And

否则,二进制数字与十进制数字完全相同,因为数字就是数字,无论你如何看待它们。唯一的区别在于,当我们查看数据时,我们如何表示十进制和二进制之间的差异。

1
使用位运算符编写加法、减法等操作总是很有趣的。对于任何对此感兴趣的人,可以查找电路指南,更具体地说是半加器、全加器,最后是减法器,甚至可能是加减器。从这里开始,您就可以将其转换为位运算符。 - 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:]

数字验证步骤是不必要的。最好立即调用int(a, 2)并处理抛出的 ValueError 异常 (如果值为无效二进制)。或者省略异常处理并让它们被引发。如果从您的代码中删除验证步骤,并调用 addBinary('113', '100'),则结果是...
回溯(最近的调用最先): 文件 "<stdin>",第 1 行,在 <module> 中 文件 "<stdin>",第 2 行,在 addBinary 中 ValueError:"invalid literal for int() with base 2: '113'"
AssertionError 类似,但不太具体。
- Mr. Lance E Sloan

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

我把减法函数留给读者作为练习。


2
你不应该发布代码并“让读者自己理解”。要解释你的代码,以便其他人可以快速理解它。 - Yannic

-1
例如,00000011 - 00000001 = 00000010。
您可以删除零,然后在计算后再添加它们!这很容易实现。
如果您的二进制被存储为字符串,则可以将其转换为int,这将自动从开头剥离零。在得到答案后,您可以将其转换回字符串并在开头添加零。

-2

不确定是否有帮助,但我在这里留下我的解决方案:

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

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

代码如上所示。


-8

我认为你对二进制的理解有些混淆。二进制和十进制只是数字的不同表示方式 - 例如,101(二进制)和5(十进制)是同一个数字。加、减和比较操作都是针对数字进行的 - 101(二进制)等于5(十进制),而加法在任何进制下都是相同的逻辑操作。


1
我认为你误解了问题的意思。OP想要一种读取/操作二进制表示中的数字并使其与整数表示中的数字交互的方法。 - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接