• ベストアンサー

数値が 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); } 上記の、日本語で書いてる部分を満たすマクロ (関数ではなく) は どういうふうにすればいいでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

((x & -x) == x) で x が 2 の冪であるかどうか判定できます。

z64423
質問者

お礼

以前からどうもモヤモヤしていたのですが、これでスッキリしました。 すばらしいです。 どうもありがとうございました。

その他の回答 (2)

  • colder
  • ベストアンサー率43% (30/69)
回答No.3

確認していないけれど、 #define HOGE(X) !(X&(X-1)) && (X>0)

z64423
質問者

お礼

なるほどです。 念のため、サンプルプログラムを書いて確認しました。 colder さんの回答、下の UKY さんの回答どちらも正しく動作しましたが、 UKY さんのほうが少しだけ回答時間が早かったので、UKY さんを 20点にしました。 どうぞ気を悪くなさらないよう。 ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ベタですが、 #define CHECK_EXP2(x) (x==16||x==32||x==64||x==128||x==256||x==512||x==1024||x==2048||x==5096) みたいな感じで、処理系で利用できる数値の範囲を羅列すればいいと思います。

z64423
質問者

お礼

以前はときどきこういうふうに書いてました。 「もうちょっとキッチリした書き方をしたいなぁ」と思い、質問してみました。 どうもご協力、ありがとうございました。

関連するQ&A