Maison  >  Questions et réponses  >  le corps du texte

c++ - 如何不使用第三个变量,交换两个char的值

对于int a 和 int b
可以使用下面的代码 互换a和b的值

void function(inta, int
b){
        a=a+b;
        b=a-b;
        a=a-b;
    }

如果交换 两个char类型,该怎么办喃?

PHP中文网PHP中文网2765 Il y a quelques jours611

répondre à tous(7)je répondrai

  • 大家讲道理

    大家讲道理2017-04-17 14:46:40

    一般的

    char型实际上是byte型,只有一个字节,因此必须考虑溢出的问题,不能用加法。
    当然,实质上int型也不能用加减法这样来交换,用位异或是个通用的办法。

    void main()
    {
        char a = 'x';
        char b = 'y';
        a ^= b;
        b ^= b;
        a ^= b;
        std::cout << "a:"<< a <<"-b:" << b<<std::endl;
        //a:y-b:x
    }

    特殊的

    如果你在windows平台下的话,可以使用内置函数

    void main()
    {
        char a = 'x';
        char b = 'y';
        b=InterlockedExchange8(&a, b);
        std::cout << "a:"<< a <<"-b:" << b<<std::endl;
        //a:y-b:x
    }

    延伸的

    你可以使用汇编来直接自行完成

    void main()
    {
        char a = 'x';
        char b = 'y';
        __asm
        {
            mov al,a
            xchg al,b
            mov a,al
        }
        std::cout << "a:"<< a <<"-b:" << b<<std::endl;
        //a:y-b:x
    }

    répondre
    0
  • 阿神

    阿神2017-04-17 14:46:40

    char其实就是int

    #include <stdio.h>
    
    void swap(char *a, char *b) {
      *a = *a ^ *b;
      *b = *a ^ *b;
      *a = *a ^ *b;
    }
    
    int main() {
      char a = 'x';
      char b = 'y';
    
      printf("交换前: a='%c', b='%c'.\n", a, b);
      swap(&a, &b);
      printf("交换后: a='%c', b='%c'.\n", a, b);
      return 0;
    }

    输出

    交换前: a='x', b='y'.
    交换后: a='y', b='x'.

    répondre
    0
  • 怪我咯

    怪我咯2017-04-17 14:46:40

    记得 是用位运算 具体忘记

    标记一下 还是等大神来解答吧

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:46:40

    void function(char &a, char &b){
      if(a==b) return ;
      a = a ^ b;
      b = b ^ a;
      a = a ^ b;
    }

    其实对于2整型(包括char),用异或交换变量比用加减好(不存在溢出问题)

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 14:46:40

    使用异或并不能提高效率/节省空间,并且当两个char相等时结果是错误的。例如:

    char a = 'f';
    char b = 'f';
    char a = b ^ a // now a == 0
    

    并且走到汇编时,并不能额外的空间,可参考 为什么用异或来交换变量是错误的

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:46:40

    char 本质也是整型

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:46:40

    需要类型转换
    所以在对char类型的数据进行转换的时候
    必须要引用一个中间的int类型第三个变量
    所以你问的问题自相矛盾。不能实现。

    répondre
    0
  • Annulerrépondre