- ベストアンサー
数値が 2 のべき乗かどうか調べるマクロ
define した値や変数値が、2 のべき乗かどうかを 関数ではなくマクロで簡単に評価できる方法はありますか。 例) #define BUFFERSIZE (2048) // OK //#define BUFFERSIZE (2000) // NG #if !(BUFFERSIZE が 2 のべき乗か調べるマクロ/評価式) # error コンパイルエラーメッセージ #endif assert(BUFFERSIZE が 2 のべき乗か調べるマクロ/評価式); buffer[idx] = data; if (BUFFERSIZE が 2 のべき乗か調べる) idx = ++idx & (BUFFERSIZE - 1); else { idx = ++idx % BUFFERSIZE; // idx = (idx + 1) >= BUFFERSIZE ? 0 : (idx + 1); } 上記の、日本語で書いてる部分を満たすマクロ (関数ではなく) は どういうふうにすればいいでしょうか。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
((x & -x) == x) で x が 2 の冪であるかどうか判定できます。
その他の回答 (2)
- colder
- ベストアンサー率43% (30/69)
確認していないけれど、 #define HOGE(X) !(X&(X-1)) && (X>0)
お礼
なるほどです。 念のため、サンプルプログラムを書いて確認しました。 colder さんの回答、下の UKY さんの回答どちらも正しく動作しましたが、 UKY さんのほうが少しだけ回答時間が早かったので、UKY さんを 20点にしました。 どうぞ気を悪くなさらないよう。 ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ベタですが、 #define CHECK_EXP2(x) (x==16||x==32||x==64||x==128||x==256||x==512||x==1024||x==2048||x==5096) みたいな感じで、処理系で利用できる数値の範囲を羅列すればいいと思います。
お礼
以前はときどきこういうふうに書いてました。 「もうちょっとキッチリした書き方をしたいなぁ」と思い、質問してみました。 どうもご協力、ありがとうございました。
お礼
以前からどうもモヤモヤしていたのですが、これでスッキリしました。 すばらしいです。 どうもありがとうございました。