文章目录

  • Python 中十六进制数的按位异或
  • 解决方案 1
  • 方案二



本文的主要目的是演示如何在 Python 的十六进制数字系统中处理 XOR 数字。


Python 中十六进制数的按位异或

XOR 是按位运算符,意思是异或。 它执行逻辑运算,如果两个输入(0 或 1)相同,则返回 1;否则返回 1。 否则,如果输入数字不同(如 0 和 1 或 1 和 0),则输出将为 0。

XOR 通常用在用于压缩、加密、图形或任何形式的通信的应用程序中。 作为按位逻辑运算符的一部分,XOR 允许更高的精度并需要更少的资源,从而使代码更快、更高效。

使用 ^ 运算符,可以很容易地对十进制数进行异或运算。 最初在字符串中或字符串的一部分的数字呢?

考虑以下代码:

def strxor(a, b):
    if len(a) > len(b):
        return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])
    else:
        return "".join(["%s" % (ord(x) ^ ord(y)) for (x, y) in zip(a, b[:len(a)])])


if __name__ == '__main__':

    print("1C2 ^ ABC = ", strxor("1C2", "ABC"))
    print("2FF ^ 78B = ", strxor("2FF", "78B"))
    print("29A ^ 90C = ", strxor("29A", "90C"))
    print("10C ^ 24B = ", strxor("10C", "24B"))
    print("BAD ^ 432 = ", strxor("BAD", "432"))
    print("54F ^ 123 = ", strxor("54F", "123"))

这给出了下面的输出:

1C2 ^ ABC =  1121113
2FF ^ 78B =  51264
29A ^ 90C =  1192
10C ^ 24B =  341
BAD ^ 432 =  118114118
54F ^ 123 =  46117

让我们验证我们的解决方案:

if __name__ == '__main__':

    print("1C2 ^ 0xABC = ",  0x1C2 ^ 0xABC)
    print("2FF ^ 0x78B = ",  0x2FF ^ 0x78B)
    print("29A ^ 0x90C = ",  0x29A ^ 0x90C)
    print("10C ^ 0x24B = ",  0x10C ^ 0x24B)
    print("BAD ^ 0x432 = ",  0xBAD ^ 0x432)
    print("54F ^ 0x123 = ",  0x54F ^ 0x123)

这给出了以下输出:

1C2 ^ 0xABC =  2942
2FF ^ 0x78B =  1396
29A ^ 0x90C =  2966
10C ^ 0x24B =  839
BAD ^ 0x432 =  3999
54F ^ 0x123 =  1132

从上面的代码可以看出,我们创建了一个名为 strxor 的新方法,它有两个名为 a 和 b 的参数,分别对应传递给该函数的两个字符串。 该方法的目的是获取两个字符串,对它们进行异或,然后返回结果(也是一个字符串)。

验证方案后,发现结果和预期的不一样。 也就是说,实现的函数strxor存在逻辑错误。

可以通过多种方式解决此问题。 其中一些定义如下:

解决方案 1

def strxor(a, b):
    if len(a) > len(b):
        res =  "".join(["%x" % (int(x,16) ^ int(y,16)) for (x, y) in zip(a[:len(b)], b)])
        return int("0x" + res, 0)
    else:
        res = "".join(["%x" % (int(x,16) ^ int(y,16)) for (x, y) in zip(a, b[:len(a)])])
        return int("0x" + res, 0)

这给出了以下输出:

1C2 ^ ABC =  2942
2FF ^ 78B =  1396
29A ^ 90C =  2966
10C ^ 24B =  839
BAD ^ 432 =  3999
54F ^ 123 =  1132

在上述解决方案中,对原始函数进行了修复,以在检查代码中更改的内容时显示正确的输出,而不是使用 ord(),它返回表示指定字符的 Unicode 代码的数字。

我们使用 int 参数是字符串之一和 16,指的是与十六进制对应的数字的基数。

方案二

def strxor(a, b):
    if len(a) > len(b):
        res = '%x' % (int(a[:len(b)],16)^int(b,16))
        return int("0x" + res, 0)

    else:
        res = '%x' % (int(a,16)^int(b[:len(a)],16))
        return int("0x" + res, 0)

这给出了以下输出:

1C2 ^ ABC =  2942
2FF ^ 78B =  1396
29A ^ 90C =  2966
10C ^ 24B =  839
BAD ^ 432 =  3999
54F ^ 123 =  1132

此方法不依赖 for 循环和 zip。 在运行时间和整体执行时间方面,它比同类产品快得多。