0

我对按位异或运算符的行为有点困惑。为什么,如果 xor 只能用于二进制数据,我是否可以将 xor 用于十进制数?

例如:

fs='a'
sn='k'    
ord(fs) ^ ord(sn)

ord(fs)给了我一个非二进制的 ASCII 码。

4

2 回答 2

1

根据内置函数的 Python 3文档ord(),返回一个整数:

给定一个表示一个 Unicode 字符的字符串,返回一个表示该字符的 Unicode 代码点的整数。例如,ord('a') 返回整数 97 [...]

该整数由位序列表示,因此它是按位异或运算符的有效操作数。

编辑

Python 将值解释97为整数。而且,在内部,整数数字类型表示为位序列。整数类型在Numeric Types中描述。同一文档的另一部分解释了 Integer Types 上的按位运算,并指出

位运算只对整数有意义。

也就是说,对任何其他类型(包括字符串)的按位运算在 Python 中都是无效的。

所以ord()返回一个整数。它在内部表示为一个位序列。尽管它的类型不是明确的“二进制”,Python 仍然为整数定义了按位异或运算符。

需要明确的是,所有值在内部都表示为位序列。只是 Python 只为整数定义了按位 XOR 运算符。

于 2018-02-17T17:38:45.170 回答
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
于 2018-02-17T17:38:53.367 回答