python中浮点数之间的异或

时间:2013-01-22 14:36:09

标签: python xor

我正在实现从RGB到Yxy颜色的转换,伪代码指导我对两个浮点变量执行XOR(^)操作。我怎么能在python中做到这一点?我收到这个错误:

^:'float'和'float'

的不支持的操作数类型

看看这个伪代码:http://www.easyrgb.com/index.php?X=MATH&H=02#text2

3 个答案:

答案 0 :(得分:4)

没有内置支持xoring浮点数。相反,您必须使用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

来提升幂(包括浮点数)

答案 1 :(得分: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-bit float xor。这会对组成浮点的每个位执行xor操作,并将其返回为double和/或64-bit float

答案 2 :(得分:-1)

您只能将位运算符应用于整数。所以首先将浮点数转换为整数。