C言語のビット演算子(XOR)を使って2つの数値を交換する方法
C言語では、一時変数を使用せずに、ビット演算子(XOR)だけで2つの数値を交換することができます。この記事では、その仕組みと具体的な実装方法を解説します。
問題
Cプログラミングにおいて、ビット演算子を使って2つの数値を交換するにはどうすればよいのでしょうか。
解決策
コンパイラは、まず与えられた10進数を2進数に変換します。その後、ビットごとのXOR演算を実行することで、メモリ上の別の場所へ数値を交換します。この方法の最大の特徴は、第3の変数(一時変数)が不要という点です。
アルゴリズム
処理の手順は以下の通りです。
START
Step 1: 2つの変数 a と b を宣言する
Step 2: コンソールから2つの数値を入力する
Step 3: ビット演算子(XOR)を使って数値を交換する
a = a ^ b
b = a ^ b
a = a ^ b
Step 4: a と b の値を出力する
STOP
プログラム
実際のC言語のコードは以下のようになります。
#include<stdio.h>
int main(){
int a,b;
printf("enter the values for a and b:");
scanf("%d%d",&a,&b);
printf("value of a=%d and b=%d before swap\n",a,b);
a= a^b;
b= a^b;
a= a^b;
printf("value of a=%d and b=%d after swap",a,b);
return 0;
}
実行結果
enter the values for a and b:24 56 value of a=24 and b=56 before swap value of a=56 and b=24 after swap
動作の解説
入力値 a=24、b=56 の場合、内部では次のように処理が進みます。
- a = 24 → 2進数表現:011000
- b = 56 → 2進数表現:111000
XOR演算を3回繰り返すことで、値が入れ替わります。
a = a^b = 011000 ^ 111000 = 100000 b = a^b = 100000 ^ 111000 = 011000 a = a^b = 100000 ^ 011000 = 111000
最終的に以下の結果が得られます。
- a = 111000 → 10進数に戻すと 56
- b = 011000 → 10進数に戻すと 24
このように、XOR演算の性質(同じ値同士のXORは0になる、任意の値と0のXORは元の値になる)を利用することで、一時変数なしで効率的に数値を交換できます。
-
参照渡しを使って3つの数値を循環的に入れ替えるC++プログラム
C++では、参照渡し(コール・バイ・リファレンス)を利用することで、3つの数値を循環順序で入れ替えることができます。具体的には、関数 cyclicSwapping() に3つの変数のアドレスを渡し、関数内で元の変数の値を直接書き換えることで、循環的な入れ替えを実現します。 循環入れ替えの仕組み このプログラムでは、x・y・z の3つの値が以下の手順で循環的に移動します。 一時変数 temp に y の値を保存する y に x の値を代入する x に z の値を代入する z に temp(元の y の値)を代入する その結果、「x の値は y へ、y の値は z へ、z の値は x へ」とい
-
C#で一時変数を使わずに2つの数値を入れ替える方法(算術演算子を活用)
C#で2つの変数の値を入れ替える(スワップする)場合、通常は一時変数(テンポラリ変数)を使用します。しかし、算術演算子を活用することで、一時変数なしでも値の交換が可能です。基本的な考え方まず、入れ替え対象となる2つの変数を用意します。val1 = 5; val2 = 10;次に、加算と減算を組み合わせた以下の手順で値を入れ替えます。val1 = val1 + val2; // val1に両方の合計を代入 val2 = val1 - val2; // 合計から元のval2を引くと、元のval1が残る val1 = val1 - val2; // 合計から新しいval2(元のval1)を引く