Python 中十六进制数的按位异或
本文的主要目的是演示如何在 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。 在运行时间和整体执行时间方面,它比同类产品快得多。
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串