我对按位xor运算符的行为有点困惑。为什么,如果xor只能用二进制数据,我可以使用带有十进制数的xor吗?
例如:
fs='a'
sn='k'
ord(fs) ^ ord(sn)
ord(fs)
给我一个非二进制的ASCII码。
答案 0 :(得分:1)
根据内置函数的Python 3 documentation,ord()
返回一个整数:
给定表示一个Unicode字符的字符串,返回表示该字符的Unicode代码点的整数。例如,ord('a')返回整数97 [...]
此整数由位序列表示,因此它是按位XOR运算符的有效操作数。
修改强>
Python将值97
解释为整数。并且,在内部,整数数字类型表示为位序列。 Numeric Types中描述了整数类型。该文档的另一部分解释了Bitwise Operations on Integer Types,并说明了
按位运算仅对整数有意义。
也就是说,任何其他类型的按位操作(包括字符串)在Python中都是无效的。
所以ord()
返回一个整数。其中内部表示为位序列。虽然它的类型不是显式的“二进制”,但Python仍然为整数定义了按位XOR运算符。
要清楚,所有值都在内部表示为位序列。只是Python只为整数定义了按位XOR运算符。
答案 1 :(得分:0)
它完全按照设计工作,只需要将它分配给变量,然后打印它们。
您可以将它们(=整数)转换回二进制字符串,例如'{0:b}'.format(some_integer)
。以下示例中的.zfill(8)
是“零填充为8个字符”,以便将它们整齐地对齐。
示例:
fs='a'
sn='k'
#assign result to variable
r = ord(fs) ^ ord(sn)
print('fs=', str(ord(fs)).rjust(3), '{0:b}'.format(ord(fs)).zfill(8))
print('sn=', str(ord(sn)).rjust(3), '{0:b}'.format(ord(sn)).zfill(8))
print('r =', str(r).rjust(3), '{0:b}'.format(r).zfill(8))
输出:
fs= 97 01100001
sn= 107 01101011
r = 10 00001010