如:我们要交换a和b的值,我们会采用第三个变量c
现在我们不采用第三个变量c,如何可以交换a,b的值

解决方案 »

  1.   

    a+b:=a
    b:=a-b
    a:=a-b
    这种方式只能用来交换integer型的,如果是其它类型的呢?比如一个指针型或者说更复杂的类型,如记录型!
      

  2.   

    a+b:=a,这算什么?编译错误呀
    [Error] Unit1.pas(32): Left side cannot be assigned to
      

  3.   

    a+b:=a
    b:=a-b
    a:=a-b
    ~~~~~~~~~~~~~~~~~~
    a:=b+a;
    b:=a-b;
    a:=a-b;这个方法对于单片机这类的惜内存如金的很重要,因为从前的单片机很多只有256字节的RAM,还有大部分是在寄存器里面直接运算,
    对于目前的大内存没太大意义了。对于类型没必要深究。
      

  4.   

    a:=a xor b;
    b:=a xor b;
    a:=a xor b;
      

  5.   

    我不用第3个变量,我总是用函数SWAP(A,B),哈哈,没有跑题吧 ?
      

  6.   

    同意Cipherliu(孤鹰) 的,这样做效率很高
      

  7.   

    从内存开辟出来一块空间,然后再swap
      

  8.   

    我以前只知道yat5460(姚小杰)的方法,用加减来解决,Cipherliu(孤鹰) 的异或方法是在书上看到过,我只知道这两种方法。
      

  9.   

    a:=b+a;
    b:=a-b;
    a:=a-b;
    对于不是整型的数据,强制转化一下就行了,交换完再转化回去。——对于浮点型当然不能用Integer(...)和Int64(...),要用PInteger和PInt64指向它们。
      

  10.   

    printf("%d,%d",a,b); //用笔记下a和b的值
    scanf("%d,%d,&a,&b);  //再将a跟b的值调换,然后再输入
    //哈哈^_^
      

  11.   

    有点想不通,怎么可能节省一个寄存器或者内存机器字加减法的a:=b+a;
    b:=a-b;
    a:=a-b;add eax, ebx
    mov ecx, eax
    sub ecx, ebx
    mov ebx, ecx
    sub eax, ebx位操作的a:=a xor b;
    b:=a xor b;
    a:=a xor b;xor eax, ebx
    mov ecx, eax
    xor ecx, ebx
    mov ebx, ecx
    xor eax, ebx始终还是必须多用一个寄存器ecx如果用第三个变量,也多用一个寄存器或者内存字,但是产生的代码就比这些技巧产生的代码简单
      

  12.   

    第一个方法:x86提供指令xchg 来对两个积存器内的值进行交换,如果delphi优化的时候将两个变量优化到积存器中,那么可以直接使用xchg来交换,不用站用任何内存空间。第二个方法:使用xor进行交换,由于xor的特殊性质,可以这样交换:
    a:=10;b:=20;
    a:=a xor b;
    b:=a xor b;
    a:=a xor b;
    于是就a=20,b=10了:)第三个方法:利用加减法的性质,a:=a+b;b:=a-b;b=a-b;和前面的xor做法有异曲同工之妙。但是缺点就是可能导致溢出
      

  13.   

    很多单片机,CPU里面内置了256字节的RAM作为变量存储,但是它比x86多提供了很多寄存器。
    代码通常是固化的、外置的EPROM(有些CPU也提供了内置EPROM),长点无所谓,但是对RAM就格外珍惜了。
    前面你写的是x86汇编,有些不同。
      

  14.   

    to pazee:刚才搜索了一下一些单片机汇编的资料,
    有些机器具有这样的指令
    add rd, rn, operand2
    算是明白了,我老是以为所有机器的指令都只能有两个操作数谢了
      

  15.   

    靠,xchg指令不行吗?嘿嘿。尽管字节多一些,毕竟还是不用。哈哈哈哈哈。:〉
      

  16.   

    应该可以的哦
       C:
        numberxor( int * a,b)
        { 
         *a:=*a~*b;
         *b:=*b~*a;
         *a:=*a~*b;
         }
              //  ~ 表示 异活  
    我倒!  时间长了 c语言都忘了哦delphi
    procedure(var a,b:integer);
    begin
      a:=a xor b;
      b:=b xor a;
      a:=a xor b;      
    end;
      

  17.   

    被褒奖的武将alphax的忠诚度变成95了(+1).