交换整数变量而不使用任何赋值

时间:2010-10-12 09:07:45

标签: c# .net algorithm

一切! 请有人帮我解决这个任务。我需要交换变量值而不使用任何赋值符号。我尝试用while循环来做这件事,但我不能在任何地方存储计数器值。提前谢谢大家。

8 个答案:

答案 0 :(得分:7)

您可以使用Interlocked.Exchange

答案 1 :(得分:6)

由于整数在C#中是不可变的,因此不能“在不使用任何赋值的情况下交换整数变量”;你需要以某种方式将它们重新分配到某个地方。也许你的意思是Swap two variables without using a temp variable? 或者,如果您的意思是没有明确地使用=,@ Konrad Rudolph的回答是要走的路。

答案 2 :(得分:6)

Xor-swap使用分配。但也许你可以使用递增和递减(严格来说,在C#中解析为+= 1-= 1但从逻辑上讲它们通常被认为是不同的。)

int tmp = 0; // C# complains if we don’t initialize!
while (a-- > 0)
    tmp++;
while (b-- > 0)
    a++;
while (tmp-- > 0)
    b++;

这是一种有时用于原始计算分析的逻辑,例如LOOP程序形式。当然,这些形式不需要字段的初始化,否则整个“无分配”规则将完全没有实际意义。在严格的微积分中,tmp也必须通过循环进行零初始化:

while (tmp > 0)
   tmp--;

无论tmp之前有什么价值(tmp > 0提供{{1}},这都是有效的,这通常是所有这些结石中的要求:负数不存在。)

但是,再次强调这一点,C#需要我们初始化每个局部变量(非局部变量是默认初始化的)所以这个循环在C#中是多余的,并且初始化仍然是必需的。

正如@Doc Brown在评论中指出的那样,这只适用于(正!)整数 - 虽然理论上(再一次:不在C#中),这可以用于任何可以在Von上表示的类型Neumann架构,因为它们都作为数字驻留在内存中(到某些基础)。

答案 3 :(得分:4)

class Program
{
    private static void Swap(ref int a, ref int b)
    {
        int.TryParse((a ^ b).ToString(), out a);
        int.TryParse((a ^ b).ToString(), out b);
        int.TryParse((a ^ b).ToString(), out a);
    }

    static void Main(string[] args)
    {
        int a = 42;
        int b = 123;
        Console.WriteLine("a:{0}\nb:{1}", a, b);
        Swap(ref a, ref b);
        Console.WriteLine("a:{0}\nb:{1}", a, b);
    }
}

答案 4 :(得分:2)

请参阅Bit Twiddling Hacks,它会告诉您如何在不使用作业的情况下以多种不同方式执行此操作。

答案 5 :(得分:2)

xor-swap是否计数?

     x ^= y;
     y ^= x;
     x ^= y;

答案 6 :(得分:2)

int i = 10, j = 20;
i = i + j;
j = i - j;
i = i - j;

答案 7 :(得分:0)

我不认为这在C#中是可能的。

XOR答案是标准答案,但您只能抓住内存并直接在较低级别的语言中操作其值。

.net语言将允许您执行等效的XOR操作并返回值,但是为了存储它,您仍然必须分配它,据我所知。根据我的想法,您只是没有直接内存访问权来执行此操作...