我正在尝试使用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();
}
}
}
请注意,这几乎没有什么用处。编译器将注意到一个典型的三步交换操作,并生成高效的汇编代码。使代码可读,而不是过早地进行优化。