【问题标题】:How to XOR two binary strings in python如何在python中对两个二进制字符串进行异或
【发布时间】:2016-11-07 08:36:16
【问题描述】:

我需要在两个二进制字符串之间进行异或运算。

xor("00110011", "11001100") = "11111111"

我正在使用这个功能

def xor(x, y):
    ans = ""
    for i in xrange(len(x)):
        if x[i] == "0" and y[i] == "1" or x[i] == "1" and y[i] == "0":
            ans += "1"
        else:
            ans += "0"
    return ans

请给我好的方法

【问题讨论】:

  • 如果您愿意,可以使用括号。顺便说一句,这段代码有什么具体问题吗?
  • edit您的问题并附上您的输入样本和预期输出。
  • 您可以使用^ - xor 运算符。请看stackoverflow.com/questions/19414093/…
  • 如果您使用的是 Python 3,这些不是 Python 意义上的二进制字符串。
  • 你也需要告诉我们边缘情况。例如,xor('01', '00') 会发生什么?是输出'1' 还是'01'。换句话说,输出是否应该始终保持相同的字符串长度

标签: python xor


【解决方案1】:
def xor(x, y):
    return '{0:b}'.format(int(x, 2) ^ int(y, 2))

感谢this answer。与流行的看法相反,Python does have bitwise operators

【讨论】:

  • 请注意,这可能会导致 更短 二进制字符串,空填充丢失。以xor('00000001', '00000000') 为例。
【解决方案2】:

如果您必须使用'0''1' 字符的字符串,只需使用映射:

_xormap = {('0', '1'): '1', ('1', '0'): '1', ('1', '1'): '0', ('0', '0'): '0'}
def xor(x, y):
    return ''.join([_xormap[a, b] for a, b in zip(x, y)])

否则,只需转换为两个整数,对它们进行异或并重新格式化为二进制字符串:

def xor(x, y):
    return '{1:0{0}b}'.format(len(x), int(x, 2) ^ int(y, 2))

这通过将零填充到x 的长度来确保生成的字符串具有相同的长度。

【讨论】:

    【解决方案3】:

    如果你需要彻底改造

    def alternative_xor(x, y):
      a = int(x)
      b = int(y)  
      return (a & ~b) | (~a & b)
    

    【讨论】:

    • 返回值也必须是字符串。但是为什么要如此谨慎地使用^呢?
    • 另外:我喜欢你对地图的使用! ^_^
    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2013-06-27
    • 2016-01-23
    • 2012-08-23
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多