如何使用xor来交换float和uint数字



我正在尝试使用xor(^(交换这两个数字。这是我迄今为止写的:

float X = 5.5f;
uint Y = 10123456;
X = X ^ Y;
Y = Y ^ X;
X = X ^ Y;

如何使用xor来交换float和uint数字?

你不能那样做™.

XOR是一个按位运算符。在浮点数字上使用它需要对IEEE-754浮点的表示方式有深入的理解。

曾经有一段时间,程序员可能需要知道这一切——我曾经处理过将IEEE浮点转换为DEC浮点并返回的需求——但现在有了硬件和经过充分调试的运行库。不要重新制造爆胎。

您的任务需要在交换值时将X转换为uint,将Y转换为float

这样做需要将32位浮点数字解释为32位整数。这通常涉及不安全的代码,如:

namespace XorSwap
{
class Program
{
unsafe static void Main()
{
float X = 5.5f;
uint* pX = (uint*) &X;
uint Y = 10123456;
*pX = *pX ^ Y;
Y = Y ^ *pX;
*pX = *pX ^ Y;
Console.WriteLine($"X = {X}");
Console.WriteLine($"Y = {Y}");
Console.WriteLine(Math.Abs(X - 1.41859833465e-38) < float.Epsilon); // 10123456 is 1.41859833465e-38 in IEEE 754 hex representation
Console.WriteLine(Y == 0x40b00000); // 5.5f is 0x40b00000 in IEEE 754 hex represenatation
Console.ReadLine();
}
}
}

请注意,这几乎没有什么用处。编译器将注意到一个典型的三步交换操作,并生成高效的汇编代码。使代码可读,而不是过早地进行优化。

最新更新