一時変数なしで変数をスワップする
1759 ワード
問題
コンピュータサイエンスで学んだ最初の問題の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番目の変数を使用しない変数です.
Reference
この問題について(一時変数なしで変数をスワップする), 我々は、より多くの情報をここで見つけました https://dev.to/lealsdev/swap-variable-values-without-a-temporary-variable-1hi7テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol