迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

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

作者:迹忆客 最近更新:2023/05/31 浏览次数:

本文的主要目的是演示如何在 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。 在运行时间和整体执行时间方面,它比同类产品快得多。

上一篇:在 Python 中将十六进制转换为 Base64

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 Python 中将十六进制转换为 Base64

发布时间:2023/06/01 浏览次数:85 分类:Python

本篇文章将介绍在 Python 中将 hex 转换为 base64 的方法。使用 Python 中的 codecs 模块将 HEX 转换为 BASE64 Python 中的 codecs 模块提供了 encode() 和 decode() 方法来实现不同文本编码格式之间的转换。

Python 中的 Fama-Macbeth 回归

发布时间:2023/06/01 浏览次数:68 分类:Python

本篇文章介绍了 Fama-Macbeth 回归、其重要性及其实施。Fama-Macbeth 回归及其重要性 在资产定价理论中,我们使用风险因素来描述资产收益。

Python 逐步回归

发布时间:2023/06/01 浏览次数:75 分类:Python

本篇文章将讨论在 Python 中执行逐步回归的方法。Python 中的逐步回归 逐步回归是一种用于统计和机器学习的方法,用于选择特征子集来构建线性回归模型。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便