我正在实现从 RGB 到 Yxy 颜色的转换,伪代码指导我对两个浮点变量执行 XOR (^) 操作。我怎么能在python中做到这一点?我收到此错误:
^ 不支持的操作数类型:“float”和“float”
看看这个伪代码:http ://www.easyrgb.com/index.php?X=MATH&H=02#text2 。
没有对浮点数异或的内置支持。相反,您必须使用该struct
模块实现一个
>>> from struct import pack, unpack
>>> def xor_float(f1, f2):
f1 = int(''.join(hex(ord(e))[2:] for e in struct.pack('d',f1)),16)
f2 = int(''.join(hex(ord(e))[2:] for e in struct.pack('d',f2)),16)
xor = f1 ^ f2
xor = "{:016x}".format(xor)
xor = ''.join(chr(int(xor[i:i+2],16)) for i in range(0,len(xor),2))
return struct.unpack('d',xor)[0]
>>> xor_float(10.25,10.25)
0.0
>>> xor_float(10.25,0.00)
10.25
注意此示例假设浮点数是 64 位浮点数,Python 原生支持
在开始解决这个问题之前,我应该看到你的伪代码。伪代码中的插入符号^
是幂而不是 xor,并且在 python 中,将数字提高到幂(包括浮点数)是通过**
或math.pow
您只能将按位运算符应用于整数。所以首先将浮点数转换为整数。
import struct, math
def fxor(a, b):
rtrn = []
a = struct.pack('d', a)
b = struct.pack('d', b)
for ba, bb in zip(a, b):
rtrn.append(ba ^ bb)
return struct.unpack('d', bytes(rtrn))[0]
print(fxor(math.pi, math.pi)) #0.0
print(fxor(math.e, math.pi)) #1.7551491316820714e-308
print(fxor(math.pi, 0)) #3.141592653589793
64-bit float
xor
. xor
这将对构成浮点的每个位执行操作并将其作为double
和/或返回64-bit float