搜尋

首頁  >  問答  >  主體

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中文网2805 天前637

全部回覆(7)我來回復

  • 大家讲道理

    大家讲道理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
    }

    回覆
    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'.

    回覆
    0
  • 怪我咯

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

    記得 是用位運算 具體忘記

    標記一下 還是等大神來解答吧

    回覆
    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),用異或交換變數比用加減好(不存在溢出問題)

    回覆
    0
  • PHP中文网

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

    使用異或並不能提高效率/節省空間,並且當兩個char相等時結果是錯誤的。例如:

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

    並且走到彙編時,並不能額外的空間,可參考 為什麼用異或來交換變數是錯誤的

    回覆
    0
  • 伊谢尔伦

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

    char 本質也是整數

    回覆
    0
  • 伊谢尔伦

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

    需要型別轉換
    所以在對char型別的資料進行轉換的時候
    必須要引用一個中間的int型別第三個變數
    所以你問的問題自相矛盾。不能實現。

    回覆
    0
  • 取消回覆