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

Algorithm 仅使用两个变量交换两个数字,algorithm,swap,Algorithm,Swap,它是如何执行交换的 a=a+b b=a+b a=b+a 我不同意把它换成书 书中的选项包括“a和b值的补码”、“否定和b”。希望这些选项也不能满足它???正确的算法应该是: a = a + b b = a - b a = a - b 交换使用XOR执行,XOR通常写为一个圆内的加号;例如: a := 5 b := 7 a := a xor b (2) b := a xor b (5) a := b xor a (7) 实际上,这可以通过两种方式实现: int a = 5, b = 10

它是如何执行交换的

a=a+b

b=a+b

a=b+a

我不同意把它换成书


书中的选项包括“a和b值的补码”、“否定和b”。希望这些选项也不能满足它???

正确的算法应该是:

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

交换使用XOR执行,XOR通常写为一个圆内的加号;例如:

a := 5
b := 7

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

实际上,这可以通过两种方式实现:

int a = 5, b = 10;
使用加法(+)和减法(-)

使用复数(*)和除法(/)


我最近接受了java Fresh的一次采访,采访者让我执行两个数字的交换(但在一行中)

两个数字的交换也可以在一行中执行,无需使用temp变量

逻辑很简单,

x与y在同一行中相加,y被指定为x,x由其和减去

在执行这一行算术运算后,数字被交换。(仅在一行中)

输出:

型锻前:x=10,y=20

型锻后:x=20和y=10


我们需要遵循三个步骤:-加、减、减

您也可以检查这一点,它以更详细的方式解释了这个概念

假设您想交换4和5。所以

步骤1(+):-将两个数字相加,第一个4+5=9。并将其中一个数字替换为总和。如果您在图中看到,我们已经替换了4

步骤2(-):-从较大的数字中减去较小的数字。所以9-5=4,用这个值替换另一个数字。就像我用4代替了5

步骤3(-):-减去刚刚得到的另一个结果,并替换为9。万岁,号码被交换。

我们可以使用异或(^)来交换。 XOR的优点:由于XOR在位级别上工作,因此它比任何其他操作花费的时间都要少。 如果a=5,b=7 然后交换:

a=a^b

b=a^b

a=a^b

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

是的,我同意你所说的,但书中引用了上面的内容。汗,如果你已经知道书中的引用事实上没有执行交换,并且你已经知道交换代码是什么样子,你的问题是什么?请与书的原件核对:有没有任何圆圈包围十字架(⊕)? 这表示的不是对变量值的算术运算,而是位异或(ExOr或ExOr)。(序列
a=a⊕b
…是更常见的“交换两个寄存器的值,一次写入一个寄存器而不使用第三个寄存器”)。(书籍选项的
是什么意思?我希望书中的打字错误。。。thanks@Logman在这种情况下,您应该选择第一种,使用加法和减法。我个人更喜欢xor解决方案,但对于更复杂的类型,您应该使用临时变量。您还应该提到,在某些语言中,
a=a+b;
可能会导致溢出错误。例如,在c#中,您需要提供
未选中的
关键字以使其工作。
a = a + b;
b = a - b;
a = a - b;
a = a * b;
b = a / b;
a = a / b;
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);
}}