一時変数なしで変数をスワップする



問題
コンピュータサイエンスで学んだ最初の問題の1つは、データのソート方法です.それを達成するためによく知られているアルゴリズムがたくさんあります.
この問題を解決するためには、コレクション内で値を交換する必要があります.
簡単にするために、バブルソートとして知られている最も簡単なソートアルゴリズムを使用します.
#include <stdio.h>

void swap(int* a, int* b) {

  int temp = *a;
  *a = *b;
  *b = temp;

  return;

}

void bubbleSort(int* arr, int size) {

  for(int i = 0; i < size; ++i) {

    for(int j = 0; j < size-i-1; ++j) {

      if(arr[j] > arr[j+1]) {
        swap(&arr[j], &arr[j+1]);
      }

    }

  }

  return;

}

int main(void) {

  int size = 8;

  int arr[8] = { 5, 4, 8, 7, 1, 2, 6, 3 };

  bubbleSort(arr, size);

  for(int i = 0; i < size; ++i) {
    printf("%d\n", arr[i]);
  }

  return 0;

}
このコードでは、スワップ操作をサポートする一時変数を使用するスワップメソッドを記述しました.

ビット単位XOR
ビット単位XORは、真の値と偽の値で操作が行われた場合にのみtrueを返します.
なお、この操作は変数の各ビットに対して行われる.
XORのテーブルを見てみましょう.
入力
入力
結果












それでは、例を見てみましょう.
入力
0 0 0 1 0 0 0
入力
0 1 0 1 1 0 0 1
結果
0 1 0 0 1 1 0 0 0
さて、XOR演算を使ってスワップ機能を書き直しましょう.CではXOR演算子は^です.
void swap(int* a, int* b) {

  *a = *a ^ *b;
  *b = *a ^ *b;
  *a = *a ^ *b;

  return;

}
このメソッドを値0001 ( 1 )と0010 ( 2 )を渡して呼び出しているとしましょう.
最初の操作はa = a ^ bです
0 0 0 1
0 0 1 0
0 0 1 1
2番目の操作はb = a ^ bです
0 0 1 1
0 0 1 0
0 0 0 1
3番目の操作はa = a ^ bです
0 0 1 1
0 0 0 1
0 0 1 0
この記事は、ビット単位XORで、値を交換することができます​​操作をサポートするために3番目の変数を使用しない変数です.