• ベストアンサー

数値が 2 のべき乗かどうか調べるマクロ

colderの回答

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

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

z64423
質問者

お礼

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

関連するQ&A

  • C++の組込みマクロのassert()が使えない

    こんにちは。 CygwinでC++開発を行っているのですが、C++の関数型マクロであるassert()が使えなくて困っています。 main関数を含むソースファイルに、 #include assert.h を記述しておけば使えるはずなのですが、そのソースファイルから実行ファイルを、 g++コマンドでビルドしようとすると、以下のようなエラーが出ます。 ------------------------------------------------------------ $ g++ test03-STLの使用.cpp /cygdrive/c/Users/Kei/AppData/Local/Temp/cckwDP4e.o:test03-STLの使用.cpp:(.text+0x904): undefined reference to `___assert_func' collect2: ld はステータス 1 で終了しました ------------------------------------------------------------ test03-STLの使用.cpp のmain関数は、以下の通りです。 ------------------------------------------------------------ int main() { string s="ABC DEF\nGH\tIJ"; reverse(s.begin(), s.end() ); assert(s=="JI\tHG\nFED CBA"); cout<<s return 0; } ------------------------------------------------------------ ちなみに、実際にインクルードされる /usr/include/assert.h の内容は以下のようになっていました。 ------------------------------------------------------------ /* assert.h */ #ifdef __cplusplus extern "C" { #endif #include "_ansi.h" #undef assert #ifdef NDEBUG /* required by ANSI standard */ # define assert(__e) ((void)0) #else # define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ __ASSERT_FUNC, #__e)) # ifndef __ASSERT_FUNC /* Use g++'s demangled names in C++. */ # if defined __cplusplus && defined __GNUC__ # define __ASSERT_FUNC __PRETTY_FUNCTION__ /* C99 requires the use of __func__. */ # elif __STDC_VERSION__ >= 199901L # define __ASSERT_FUNC __func__ /* Older versions of gcc don't have __func__ but can use __FUNCTION__. */ # elif __GNUC__ >= 2 # define __ASSERT_FUNC __FUNCTION__ /* failed to detect __func__ support. */ # else # define __ASSERT_FUNC ((char *) 0) # endif # endif /* !__ASSERT_FUNC */ #endif /* !NDEBUG */ void _EXFUN(__assert, (const char *, int, const char *) _ATTRIBUTE ((__noreturn__))); void _EXFUN(__assert_func, (const char *, int, const char *, const char *) _ATTRIBUTE ((__noreturn__))); #ifdef __cplusplus } #endif ------------------------------------------------------------ Borland C++ Compilerのbcc32コマンドでは、先ほどのソースファイルから実行ファイルをビルドすることができたので、何が問題なのかが分かりません。 以上の件について何かご存知の方がいらっしゃれば、是非教えて頂きたいと思います。 では、よろしくお願い致します。

  • #if

    #if defined(DECRYPTION_KEY_SCHEDULE) #if DEC_ROUND == NO_TABLES #define ff(x) (x) #else #define ff(x) inv_mcol(x) #ifdef dec_imvars #define d_vars dec_imvars #endif #endif 上の部分をコンパイルすると、 'ff'マクロが再定義されました というエラーメッセージが出るのですが、 なぜ再定義になるのか分かりません。  OS:Win2000 コンパイラ VC++ 6.0 以前は、同じようなエラーが出て、 #else を使わないで全て書き直しました。  よろしくお願いいたします。

  • プリプロセッサ

    ソースの先頭で #define DEBUGPOINT 1 や #define DEBUGPOINT 5 などを記述して、 #if(DEBUGPOINT==1) debugprint(hWnd, buffer, count); #endif ... #if(DEBUGPOINT==3) debugprint(hWnd, buffer, count); #endif ... #if(DEBUGPOINT==5) debugprint(hWnd, buffer, count); #endif のようなソースで、好きな部分で1回だけdebugprint()を実行できるようにしたいです。 #define DEBUGPOINTの値を変更するだけでいいようにしたいのですが、上に書いたdefineの使い方で間違っている部分はありませんか?

  • マクロ初級 #define

    #include <iostream.h> #define mkr(a) {cout << a;\cout << b;\} void main(void){ cout << "2数を表示するマクロ" << endl; mkr(1,9); } ↑これをコンパイルするとエラーになりました。 エラー 5行目 マクロ 'mkr' の呼び出しにおける引数の個数が 誤っている(関数 main() ) ネット上で見つけたものなんですが、このプログラムを 正しく修正するとどうなるんですか? マクロのソースを見たのは初めてだったので分かりませんでした。

  • コンパイル時のスイッチについて

    C言語初心者なので申し訳ありませんが,コンパイル時のスイッチについて困っております. 現在, #define tmp ... #ifdef tmp  関数1 #else  関数2 #endif とtmpを定義して切り替えようとしております. 現在コンパイルの切替は,毎回 //#define tmp とコメントアウトして切り替えているのですが, gcc等のコンパイラのコマンドラインから 切り替える方法はあるのでしょうか. 色々調べたら, cc -D tmp みたいな?感じにするのかと思ったのですがうまくいきません. 初歩の質問ですがご教授よろしくお願いします.

  • 秀丸マクロをハイライトするマクロ

    htmlタグで秀丸マクロをハイライトするマクロを作っています。 強調表示のファイルを見ながら作っています。 「if」 「else if」 「else」を上手に区別する正規表現方法を教えてください。 また、このようなマクロを作るときに役立ちそうな方法がありましたら教えてください。 このようなソースを if (条件式1) message "コメント1"; else if (条件式2) message "コメント2"; else if (条件式3) message "コメント3"; else message "コメント4"; このようにhtmlタグを付けていきます。 <span class="if">if</span> (条件式1) <span class="message">message</span> "コメント1"; <span class="else_if">else if</span> (条件式2) <span class="message">message</span> "コメント2"; <span class="else_if">else if</span> (条件式3) <span class="message">message</span> "コメント3"; <span class="else">else</span> <span class="message">message</span> "コメント4"; マクロはこんな感じです。 setcompatiblemode 0x0F; begingroupundo; replaceall "message" , "<span class=\"message\">message</span>" , regular, word; replaceall "if" , "<span class=\"if\">if</span>" , regular, word; replaceall "else_if" , "<span class=\"else_if\">else_if</span>" , regular, word; replaceall "else" , "<span class=\"else\">else</span>" , regular, word; if( ! result ) beep; endgroupundo 1; endmacroall; 単語の検索 http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/190_CmdSearch_WordSearch.html 検索(Ver8.04対応版) http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/070_Env_Search.html

  • マクロの展開(C言語)について

    #define WRITE_test(TEST) \ do{ \ fprintf(stderr, "%s can't open\n", #TEST); \ }while(0); というマクロを書いた上で、ソースをコンパイルすると /**/ if (length_max/*LENGTH_buf_mpi*/ > length+strlen(buf_)) do{ fprintf(stderr, "%s can't open\n", "test"); }while(0); else if (length_max/*LENGTH_buf_mpi*/ > length+strlen(buf_)) do{ fprintf(stderr, "%s can't open\n", "test"); }while(0); else break; とある箇所にエラーなどは現れず /**/ if (length_max/*LENGTH_buf_mpi*/ > length+strlen(buf_)) WRITE_test(test); else if (length_max/*LENGTH_buf_mpi*/ > length+strlen(buf_)) WRITE_test(test); else break; とある箇所で、 「buf_.c:263: error: 構文解析エラー が "else" の前にあります」 というメッセージが現れます。263行とはひとつめのWRITE_test()がある箇所です。  マクロはテキストが置換、展開されるものと考えると、この結果に納得できないでおります。説明がつくでしょうか?  コンパイルはgentoo Linux上で/usr/bin/gcc-3.4.4によるものです。

  • 新規ソース内のマクロ定義が既存ソース内のマクロ定義と衝突しない策について

    C言語です。 Effective C++か何かで読んだ const int hoge = 3; const char *bar = "HOGEHOGE"; などを使用しようと思ったのですが、 C言語ではコンパイルする際に、 「関数の外では定数は宣言できません」?? のようなエラーが出てしまいました。 そこでこれらを使用するのは諦めて、 #define~を使って定数を使用しました。 (上記のようなエラーが出てしまうのは、 C言語の仕様上、文法がおかしいからだと 思います。そもそもC++に関する本に 載ってるtipsだし^^;) #defineを使用するように修正して、コンパイルする際に、 既存のソース上のマクロ定義(#define~)と名前が重複するものが いくつか見つかり、修正に手間がかかりました。 マクロ定義なので、スコープという概念は 適用されないと思うので、既存のソースと新規のソースで マクロ定義がバッティングしないようにする策としては どのようなものがあるでしょうか? 今のところ思いつくものとしては以下です。 ・新規のソースに関するキーワードをプリフィックスとして使用する ・新規のソースの末尾で#undefをする。(これは試してないので有効か  どうか自信がありません。) 他に何か有効な策がありましたら教えてください。 よろしくお願いいたします。

  • Excel 改ページのマクロ

    同シート内で改ページを設定するマクロを、ここで教えてもらったのですが、改ページを判断するデータの列が関数(vlookup)で持ってきたデータの場合にうまく機能しません。下のマクロに手を加えれば可能でしょうか? Sub Macro4() Const col As String = "A" '改ページを判断するデータの列名 Dim idx As Long Dim sv sv = Cells(1, col).Value For idx = 1 To Cells(65536, col).End(xlUp).Row   If Cells(idx, col).Value <> sv Then     ActiveSheet.HPageBreaks.Add Before:=Rows(idx)     sv = Cells(idx, col).Value   End If Next idx End Sub

  • エクセルVBA Callステートメントについて教えてください。

    いつもお世話になっております。 IF ○○○○ Then Call ○○○○なときのマクロ Else Call ××××なときのマクロ Endif というマクロを書きました。 (実際はかなり長くて複雑です) Callを使用すると、 見た目がすっきりする以外に何かメリット またはデメリットがあるのでしょうか。 以下の場合と何か異なるでしょうか? IF ○○○○ Then '○○○○なときのマクロの内容を記述 ~~~~~~~ Else '××××なときのマクロの内容を記述 ~~~~~~~ Endif ご教示いただければ幸甚です。