C#で数値が2の累乗かどうかを判定する方法をわかりやすく解説
「2の累乗」とは、整数 n を用いて 2n の形で表せる数のことです。つまり、基数を2、指数を整数 n としてべき乗計算を行った結果の値を指します。
代表的な2の累乗は以下の表のとおりです。
| n | 2n |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |
| 4 | 16 |
| 5 | 32 |
このように、n = 0 のときは 20 = 1 となる点に注意してください。1 もまた2の累乗に含まれます。
C#で数値が2の累乗かどうかを判定するには、主に2つのアプローチがあります。それぞれサンプルコードとともに見ていきましょう。
方法1:ビット演算を使う(高速・定番)
2の累乗である数をバイナリで表すと、最上位ビットだけが1になり、それ以外はすべて0になります。例えば、8 は 1000、16 は 10000 です。この性質を利用すると、「x と (x - 1) の論理積(AND)が 0 になるか」を調べるだけで判定できます。これは非常に効率的な定番テクニックです。
class Program {
static void Main() {
Console.WriteLine(IsPowerOfTwo(9223372036854775809));
Console.WriteLine(IsPowerOfTwo(4));
Console.ReadLine();
}
static bool IsPowerOfTwo(ulong x) {
return x > 0 && (x & (x - 1)) == 0;
}
}実行結果
False True
解説: x > 0 のチェックにより、0 や負の数を除外しています。(x & (x - 1)) == 0 が成立するのは、x が2の累乗の場合だけです。上記の例では、9223372036854775809(2^63 + 1)は累乗ではないため False、4 は 22 なので True が出力されます。
方法2:繰り返し2で割る(直感的で理解しやすい)
もうひとつの方法は、数値を1になるまで繰り返し2で割っていくアプローチです。途中で奇数(2で割り切れない数)が出てきたら2の累乗ではないと判断できます。処理の流れが直感的なので、ロジックを理解しやすいのが特徴です。
class Program {
static void Main() {
Console.WriteLine(IsPowerOfTwo(9223372036854775809));
Console.WriteLine(IsPowerOfTwo(4));
Console.ReadLine();
}
static bool IsPowerOfTwo(ulong n) {
if (n == 0)
return false;
while (n != 1) {
if (n % 2 != 0)
return false;
n = n / 2;
}
return true;
}
}実行結果
False True
解説: まず n == 0 の場合を除外します。その後、ループ内で n % 2 != 0(奇数かどうか)を確認し、奇数なら false を返します。最終的に n が 1 になれば、それは2の累乗だったということになります。
どちらの方法を選ぶべきか?
パフォーマンスを重視する場合はビット演算(方法1)がおすすめです。ループが不要で、1回の演算で判定できるため高速です。一方、コードの可読性や学習目的を重視するなら、繰り返し除算(方法2)の方が処理内容をイメージしやすいでしょう。どちらの手法も結果は同じなので、用途に応じて使い分けてください。
-
USBポートの電力出力を確認する3つの方法【Windows標準機能・無料ソフト・テスター】
USBポートの充電が遅い、あるいは仕様どおりに動作していないように感じたことはありませんか?接続した機器に必要な電力が十分に供給されていないと感じたら、Windowsの標準機能、サードパーティ製アプリ、またはUSBテスター(電圧計)を使って、ポートの出力電力を簡単に調べることができます。Windowsの標準機能で確認する方法Windowsでは、デバイスマネージャーを使ってUSBポートの電力供給能力を確認できます。Windows 10での手順は以下のとおりです。1. タスクバーの検索ボックスに「デバイスマネージャー」と入力します。タスクバーに検索ボックスが表示されていない場合は、タスクバーの空い
-
飛行機にモバイルバッテリーは持ち込める?容量の上限と確認方法を解説
スマホの充電切れに備えてモバイルバッテリーがあると便利です。特に、初めて訪れる都市や海外に到着する直前には心強い味方になります。しかし、飛行機にモバイルバッテリーや予備バッテリーを持っていく予定があるなら、事前にスペックを確認しておきましょう。すべてのバッテリーが機内に持ち込めるわけではありません。大容量のモバイルバッテリーや複数の小型バッテリーの持ち込みは、航空機にとってリスクになり得ます。特に、火災が発生しても対処が難しい貨物室に積まれた場合はなおさらです。Wh(ワット時)やmAh(ミリアンペア時)といった単位についてすでにご存じの方は、記事後半のフローチャートまでスキップしていただいて構