C++で条件演算子を使わずに変数へ別の値を代入する方法
問題の概要
条件演算子(if文や三項演算子など)を一切使わずに、変数に対して2つの候補値のうち「現在とは異なる方」の値を代入する方法を考えます。
問題の詳細
この問題では、変数 a が与えられ、その値は x と y のどちらか一方と等しいものとします。ここで、a の現在の値が x と y のどちらであるかを判定せずに(つまり条件分岐を一切使わずに)、もう一方の値を a に代入するプログラムを作成する必要があります。
具体例で問題を確認してみましょう。
入力 : a = 43 ; x = 43 , y = 21 出力 : 21
説明 − a の初期値は 43 なので、もう一方の値である 21 を a の最終的な値として返す必要があります。
条件分岐が使えないため、「a の値を確認してから代入する」という単純なアプローチは取れません。そこで、条件判定に頼らない別の手法を検討する必要があります。実現方法は複数ありますが、ここでは最も実用的で分かりやすい2つの方法を紹介します。
方法1:算術演算子を使う
最もシンプルな方法のひとつが、加算と減算(または乗算と除算)を組み合わせる手法です。加算で値をまとめた後、減算で逆の操作を行う、という流れです。
数式で表すと次のようになります。
a = x + y − a または a = x * y / a
ただし、乗算と除算の組み合わせは計算コストが高いうえ、除算ではゼロ除算のエラーが発生するリスクがあります。そのため、実用上は「加算 − 減算」の組み合わせを採用するのが安全です。この式の仕組みは以下の通りです。
- a が x に等しい場合:a = x + y − x = y となり、y が代入される
- a が y に等しい場合:a = x + y − y = x となり、x が代入される
つまり、どちらの場合でも「現在と異なる値」が自動的に得られます。
コード例
#include <iostream>
using namespace std;
int main(){
int x = 45;
int y = 5;
int a = x;
cout << "a の初期値 : " << a;
a = x + y - a;
cout << "\n値を切り替えた後の a : " << a;
return 0;
}実行結果
a の初期値 : 45 値を切り替えた後の a : 5
方法2:ビット単位XOR演算子を使う
さらに効率的でエレガントな方法として、ビット単位のXOR演算子(^)を活用する手法があります。XORには「同じ値同士のXORは0になる」「任意の値と0のXORは元の値に戻る」という性質があり、これを利用することで条件分岐なしに値を切り替えられます。
式は次のようになります。
a = x ^ y ^ a;
この式の動作を確認してみましょう。
- a が x に等しい場合:a = x ^ y ^ x = y となり、y が代入される
- a が y に等しい場合:a = x ^ y ^ y = x となり、x が代入される
XOR演算は加減算よりも高速に処理できるほか、オーバーフローの心配もありません。ただし、大きな値を扱う場合にはビット幅に注意が必要です。
コード例
#include <iostream>
using namespace std;
int main(){
int x = 56;
int y = 78;
int a = x;
cout << "a の初期値 : " << a;
a = x ^ y ^ a;
cout << "\n値を切り替えた後の a : " << a;
return 0;
}実行結果
a の初期値 : 56 値を切り替えた後の a : 78
まとめ
条件演算子を使わずに変数の値を切り替える方法として、以下の2つを紹介しました。
- 算術演算子による方法:直感的で分かりやすいが、加算時のオーバーフローに注意が必要
- XOR演算子による方法:高速かつオーバーフローの心配が少なく、ビット演算の性質を活かしたエレガントな手法
どちらの方法も、x と y のどちらの値が入っているかにかかわらず、必ず「もう一方の値」を返すことが保証される点がポイントです。
-
C++で2つのBSTから合計が指定値xと等しいペアを数える方法
2つの二分探索木(BST)と整数値 x が与えられます。この記事の目的は、BST_1 から1つのノード、BST_2 からもう1つのノードを選んだペアのうち、両ノードの値の合計が x に一致するものの個数を求めることです。具体的には、BST_1 のノードと BST_2 のノードのデータ部分を加算し、その合計が x と等しければカウントを1つ増やしていきます。具体例で確認してみましょう。入力出力 − 合計が指定値 x に等しい2つのBSTからのペアの数 − 1説明 − 該当するペアは (8, 6) です。入力出力 − 合計が指定値 x に等しい2つのBSTからのペアの数 − 2説明 − 該当するペ
-
Pythonで変数に値を代入する方法を徹底解説!基本の代入から条件分岐まで
変数への値の代入は、あらゆるプログラミング言語において最も基本的な操作のひとつです。Pythonでは、変数を宣言して値を代入する方法が複数用意されており、状況に応じて使い分けることができます。この記事では、代表的な代入方法をそれぞれわかりやすく解説します。 直接代入(ダイレクト・イニシャライズ) 最もシンプルな方法は、=(代入演算子)を使って変数を直接宣言し、値を代入するやり方です。なお、同じ変数に対して複数回値を代入した場合、プログラムでは最後に代入された値が使用される点に注意しましょう。 コード例 x = 5 x = 9 print(x) 上記のコードを実行すると、次のような結果が出力され