C++で整数が4の累乗かどうかを判定する方法
問題概要
整数が与えられたとき、その数が4の累乗であるかどうかを判定する問題です。
例えば、入力が16であれば、出力はTrueになります。
解決アプローチ
この問題は、ビット演算を活用することで効率的に解くことができます。以下の手順に従って判定を行います。
num < 0の場合 → false を返すnum & (num - 1)の結果が 0 以外の場合 → false を返すnum & 0x55555555(バイナリ表記で 0101...0101)の結果が 0 の場合 → false を返す上記のチェックすべてを通過した場合 → true を返す
アルゴリズムの解説
num & (num - 1) は、数が2の累乗であるかを判定するための有名なテクニックです。2の累乗はバイナリ表現において1つのビットのみが立ちます。この条件を満たさない数は、この時点で除外されます。
次に、4の累乗は2の累乗の中でも、立っているビットの位置が必ず偶数インデックス(0番目、2番目、4番目…)でなければなりません。そこで、マスク値 0x55555555 とのAND演算を行うことで、ビットが正しい位置にあるかを確認できます。
実装例
理解を深めるために、以下のC++による実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isPowerOfFour(int num){
if (num < 0)
return false;
if (num & (num - 1))
return false;
if (!(num & 0x55555555))
return false;
return true;
}
};
main(){
Solution ob;
cout << (ob.isPowerOfFour(64));
}
入力
64
出力
1
まとめ
このアルゴリズムは、ループや再帰を使わずに定数回のビット演算だけで判定できるため、時間計算量 O(1) という非常に効率的な手法です。負の数の除外、2の累乗判定、ビット位置の確認という3段階のチェックで、4の累乗を正確に見分けることができます。
-
C++のvoid関数でreturnする方法|値以外を返すテクニックを解説
void関数が「void(空)」と呼ばれるのは、何も返さないためです。しかし、「void関数は何も返せない」という説明は、必ずしも正しいとは言えません。void関数から値を返すことはできませんが、値以外のものを返したり、return文を活用したりすることは可能です。本記事では、その具体的な方法をサンプルコードとともに解説します。void関数でもreturn文は使えるvoid関数は値を返すことができませんが、return文そのものを記述することは可能です。引数なしのreturn文は「この時点で関数を終了する」という意図を明示的に示す働きがあり、処理の流れが分かりやすくなるため、コードの可読性向上
-
C++でオブジェクトを返す方法とは?サンプルコードでわかりやすく解説
オブジェクトとは、クラスから生成される実体(インスタンス)のことです。メモリが割り当てられるのはクラスを定義した時ではなく、オブジェクトを実際に生成した時点です。 C++では、関数内でreturnキーワードを使うことで、オブジェクトをそのまま戻り値として返すことができます。以下に、Pointクラスを使った具体的なサンプルコードを示します。 サンプルコード #include <iostream> using namespace std; class Point { private: int x; int y; public: Point(in