XORing两个双变量

时间:2014-06-24 08:13:11

标签: c++ double xor

我写了以下两行:

第1行:

int a;
a=a^a;

第2行:

double d;
d=d^d;

第1行工作正常,但第2行给我错误:

error: invalid operands of types ‘double’ and ‘double’ to binary ‘operator^’

有人可以告诉我为什么逐位 XOR运算符适用于两个 int ,但不适用于两个 double 变量。 ??

似乎是一个愚蠢的怀疑......但如果没有这个,我真的无法完成我的计划......!

4 个答案:

答案 0 :(得分:3)

因为标准是这样说的。

  

C ++11§5.12按位异或运算符

     

执行通常的算术转换;结果是操作数的按位异或功能。 运算符仅适用于整数或枚举操作数。

在我看来,xor两个double并没有多大意义。

答案 1 :(得分:1)

因为XOR与其他布尔位运算符一样被定义用于二进制运算,例如0b10^0b01 = 0b11但是对于表示与值不同的任何内容都没有意义。如果你异常4.01.0,你应该得到值的XOR,即5.0或表示的按位异或。如果前者你对精度不完全重叠的值做了什么,例如“1.89e92 and 0.01`?虽然后者很难定义(并且可能毫无意义),因为C ++标准没有准确定义双精度如何表示,并且在计算和存储期间它可能有不同的表示。

答案 2 :(得分:0)

xor是在不使用临时寄存器的情况下交换两个值(整数,IEEE标准或任何其他值)的最简单方法。我不明白今天的程序员如何在不了解50年前最简单的概念的情况下通过学校。

int a, b;
a=a^b;
b=a^b;
a=a^b;

答案 3 :(得分:0)

我认为其他答案很好地解释了为什么默认情况下不支持它。您可能不应该这样做,但是这是您可以做到的方式:

    double d = 12345.6789;
    unsigned long long* uPtr = (unsigned long long*)&d;
    unsigned long long uXor = (*uPtr) ^ (*uPtr);
    double dXor = *((double*)&uXor);