我对按位异或运算符的行为有点困惑。为什么,如果 xor 只能用于二进制数据,我是否可以将 xor 用于十进制数?
例如:
fs='a'
sn='k'
ord(fs) ^ ord(sn)
ord(fs)
给了我一个非二进制的 ASCII 码。
我对按位异或运算符的行为有点困惑。为什么,如果 xor 只能用于二进制数据,我是否可以将 xor 用于十进制数?
例如:
fs='a'
sn='k'
ord(fs) ^ ord(sn)
ord(fs)
给了我一个非二进制的 ASCII 码。
根据内置函数的 Python 3文档ord()
,返回一个整数:
给定一个表示一个 Unicode 字符的字符串,返回一个表示该字符的 Unicode 代码点的整数。例如,ord('a') 返回整数 97 [...]
该整数由位序列表示,因此它是按位异或运算符的有效操作数。
编辑
Python 将值解释97
为整数。而且,在内部,整数数字类型表示为位序列。整数类型在Numeric Types中描述。同一文档的另一部分解释了 Integer Types 上的按位运算,并指出
位运算只对整数有意义。
也就是说,对任何其他类型(包括字符串)的按位运算在 Python 中都是无效的。
所以ord()
返回一个整数。它在内部表示为一个位序列。尽管它的类型不是明确的“二进制”,Python 仍然为整数定义了按位异或运算符。
需要明确的是,所有值在内部都表示为位序列。只是 Python 只为整数定义了按位 XOR 运算符。
它完全按照设计工作,只是您需要将其分配给变量并打印它们。
您可以将它们(=整数)转换回像这样的二进制字符串'{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