Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

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=24b=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は元の値になる)を利用することで、一時変数なしで効率的に数値を交換できます。

  1. 参照渡しを使って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 へ」とい

  2. C#で一時変数を使わずに2つの数値を入れ替える方法(算術演算子を活用)

    C#で2つの変数の値を入れ替える(スワップする)場合、通常は一時変数(テンポラリ変数)を使用します。しかし、算術演算子を活用することで、一時変数なしでも値の交換が可能です。基本的な考え方まず、入れ替え対象となる2つの変数を用意します。val1 = 5; val2 = 10;次に、加算と減算を組み合わせた以下の手順で値を入れ替えます。val1 = val1 + val2; // val1に両方の合計を代入 val2 = val1 - val2; // 合計から元のval2を引くと、元のval1が残る val1 = val1 - val2; // 合計から新しいval2(元のval1)を引く