Python中浮点数的异或运算

1 投票
3 回答
4645 浏览
提问于 2025-04-17 13:21

我正在实现从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来实现的。

撰写回答