代码之家  ›  专栏  ›  技术社区  ›  Azat

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

  •  1
  • Azat  · 技术社区  · 14 年前

    全部! 有人能帮我解决这个问题吗。我需要在不使用任何赋值符号的情况下交换变量值。我试着用while循环来实现,但是我不能在任何地方存储计数器值。提前谢谢大家。

    8 回复  |  直到 14 年前
        1
  •  7
  •   Dirk Vollmar    14 年前
        2
  •  6
  •   Community CDub    8 年前

    因为整数在C#中是不可变的,所以不能“不使用任何赋值就交换整数变量”;您需要在某个地方以某种方式重新赋值它们。也许你是说 Swap two variables without using a temp variable ? 或者,如果你的意思是不用解释 =

        3
  •  6
  •   Konrad Rudolph    14 年前

    异或交换使用分配。但是也许你可以使用增量和减量(严格地说,它决定 += 1 -= 1 但在逻辑上,它们通常被认为是不同的。

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

    tmp 也必须由循环初始化为零:

    while (tmp > 0)
       tmp--;
    

    tmp公司 以前有过 tmp > 0 ,这通常是所有这些计算中的一个要求:不存在负数)。

    要求 我们要初始化每个局部变量(非局部变量是默认初始化的),所以这个循环在C#中是多余的,仍然需要初始化。

    正如@Doc Brown在评论中指出的,这只对(积极的!)虽然理论上是整数(再一次:不在C中!)这可以用来处理Von Neumann体系结构中可以表示的任何类型,因为它们都以数字(到某个基数)的形式存在于内存中。

        4
  •  4
  •   hoang    14 年前
    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);
        }
    }
    
        5
  •  2
  •   Dave    14 年前
        6
  •  2
  •   Jakob    14 年前

    异或交换计算吗?

         x ^= y;
         y ^= x;
         x ^= y;
    
        7
  •  2
  •   Preet Sangha    14 年前
    int i = 10, j = 20;
    i = i + j;
    j = i - j;
    i = i - j;
    
        8
  •  0
  •   Frosty840    14 年前

    我想这在C#是不可能的。

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