我写了以下两行:
第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 变量。 ??
似乎是一个愚蠢的怀疑......但如果没有这个,我真的无法完成我的计划......!
答案 0 :(得分:3)
因为标准是这样说的。
C ++11§5.12按位异或运算符
执行通常的算术转换;结果是操作数的按位异或功能。 运算符仅适用于整数或枚举操作数。
在我看来,xor两个double
并没有多大意义。
答案 1 :(得分:1)
因为XOR与其他布尔位运算符一样被定义用于二进制运算,例如0b10^0b01 = 0b11
但是对于表示与值不同的任何内容都没有意义。如果你异常4.0
和1.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);