重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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);
}


上記の、日本語で書いてる部分を満たすマクロ (関数ではなく) は
どういうふうにすればいいでしょうか。

よろしくお願いします。

A 回答 (3件)

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

    • good
    • 1
この回答へのお礼

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

お礼日時:2005/08/07 16:14

確認していないけれど、



#define HOGE(X) !(X&(X-1)) && (X>0)
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/07 16:15

ベタですが、


#define CHECK_EXP2(x) (x==16||x==32||x==64||x==128||x==256||x==512||x==1024||x==2048||x==5096)
みたいな感じで、処理系で利用できる数値の範囲を羅列すればいいと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/08/07 16:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A