使用仅两个变量交换两个数字

3

它的交换操作表现如何?

a=a+b

b=a-b

a=a-b

我不同意把它和一本书交换!!!

这本书的选项包括“a和b的补集”、“否定a和b”。希望这些选项也不会让你满意吗?


1
请检查书中原文是否有一个圆圈包围着十字(⊕)?这将表示不是对变量值进行算术运算,而是按位异或(ExOr或EXOR)。 (序列a = a⊕b ...更常见的是“交换两个寄存器的值,一次写入一个寄存器,不使用第三个寄存器”)。 (“书籍选项”是什么意思?) - greybeard
希望书中有错别字是笔误...谢谢。 - Khan
5个回答

11

正确的算法应该是:

a = a + b 
b = a - b
a = a - b 

是的,我同意你所说的,但是这本书引用的内容就像上面那样。 - Khan
2
如果你已经知道这本书的引用实际上并没有执行交换操作,并且你已经知道交换代码的样子,那么你的问题是什么? - Amadan

8

使用异或(XOR)执行交换操作,通常用圆圈内的加号表示;例如:

a := 5
b := 7

a := a xor b (2)
b := a xor b (5)
a := b xor a (7)

0

最近我参加了一次Java新手的面试,面试官让我一行代码内完成两个数字的交换。

不使用临时变量,也可以在一行代码中完成两个数字的交换。

其逻辑非常简单,

在同一行内将x与y相加,同时将y赋值为x减去它们的和。

执行这个算术操作后,这两个数字就会被交换(仅用一行代码)。

public class SwapInOneLine {
public static void main(String[] args) {

    int x = 10; int y = 20;
    System.out.println("Before Swaping: x = " + x + " and y= " + y);
    x = x + y - (y = x);
    System.out.println("After Swaping: x = " + x + " and y= " + y);
}}

输出:

交换前:x = 10,y = 20

交换后:x = 20,y = 10


0
我们可以使用XOR (^)来实现这个目的。 XOR的优点:由于XOR在位级别上运行,所以它比其他任何操作都需要更少的时间。 如果a = 5,b = 7 那么进行交换:

a = a ^ b

b = a ^ b

a = a ^ b

其中'^'表示XOR。 结果: a = 7,b = 5


-1

实际上,有两种方法可以做到:

int a = 5, b = 10;

使用加法(+)和减法(-)

a = a + b;
b = a - b;
a = a - b;

使用多个(*)和除法(/)

a = a * b;
b = a / b;
a = a / b;

@Logman 在那种情况下,你应该选择第一个方法,使用加法和减法。 - Pankaj Lilan
个人而言,我更喜欢使用异或(xor)解决方案,但对于更复杂的类型,无论如何都应该使用临时变量。您还应该提到,在某些语言中,“a=a+b;”会导致溢出错误。例如,在c#中,您需要提供“unchecked”关键字才能使其正常工作。 - Logman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接