Python中浮点数的异或运算
我正在实现从RGB颜色转换到Yxy颜色,伪代码指导我对两个浮点数变量执行异或(XOR)操作。请问我该如何在Python中做到这一点?我遇到了这个错误:
不支持的操作数类型:'float'和'float'。
看看这个伪代码: http://www.easyrgb.com/index.php?X=MATH&H=02#text2。
3 个回答
0
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位浮点数的异或操作。这是在浮点数的每一位上进行异或运算,然后将结果以双精度浮点数或64位浮点数的形式返回。
0
你只能对整数使用位运算符。所以首先要把浮点数转换成整数。
4
Python并没有直接支持对浮点数进行异或运算(xor)。所以你需要使用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本身支持的格式。
在我开始解决这个问题之前,我应该先看看你的伪代码。伪代码中的插入符号^
表示的是幂运算,而不是异或运算。在Python中,进行幂运算(包括浮点数)是通过**
或者math.pow
来实现的。