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。 在运行时间和整体执行时间方面,它比同类产品快得多。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要将 Python 十六进制转换为二进制,可以使用内置函 bin() 和 int()。 示例代码: ``` hex_num = "0x1F" bin_num = bin(int(hex_num, 16))[2:] print(bin_num) ``` 这里,先使用 int() 将十六进制转换为整,然后使用 bin() 将整转换为二进制字符串,再去掉开头的 '0b',即可得到对应的二进制。 ### 回答2: Python,可以使用内置函`bin()`来将16进制转换为2进制。 首先,将16进制表示为字符串形式,例如:"1A"。然后,将该字符串作为参传递给`int()`函,并指定第二个参为16,这样`int()`函将会将字符串解析为16进制。 接下来,使用`bin()`函将转换后的16进制转换为2进制。`bin()`函返回的是一个字符串表示的2进制,并且以"0b"开头,例如:"0b11010"。 下面是一个例子: ```python hex_str = "1A" hex_num = int(hex_str, 16) binary_str = bin(hex_num) print(binary_str) ``` 以上代码的输出结果将会是:"0b11010",表示16进制"1A"转换为2进制为"11010"。 需要注意的是,Python的`bin()`函返回的是一个带有前缀"0b"的字符串,如果需要去除前缀,可以使用切片操作,例如`binary_str[2:]`。 同时,还可以使用字符串的`format()`方法来进行16进制转2进制的操作,代码示例如下: ```python hex_str = "1A" hex_num = int(hex_str, 16) binary_str = format(hex_num, 'b') print(binary_str) ``` 以上代码的输出结果与前面的例子相同。使用`format()`方法时,需要指定第二个参为'b'来表示转换为二进制。 ### 回答3: Python可以使用内置函bin()将十六进制转换为二进制,下面是一个示例代码: ```python hex_num = "AB" binary_num = bin(int(hex_num, 16))[2:] # 将十六进制转换为整后再转换为二进制,并去掉开头的"0b" print(binary_num) ``` 在上面的代码,我们定义了一个十六进制`hex_num`,然后使用`int(hex_num, 16)`将其转换为对应的整。接着,使用`bin()`将整转换为二进制,并通过切片操作`[2:]`去掉开头的"0b"。最后,将转换后的二进制打印出来。 该代码的输出结果将是`10101011`,即十六进制"AB"转换为二进制的结果。 以上就是使用Python十六进制转换为二进制的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迹忆客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值