5

ビットシフトおよびマスキング操作を使用するために、コンパイル時にいくつかの定数を生成する必要がある状況がよくあります。

例えば

#define blockbits 8
#define blocksize 256   // could be generated from 2^blockbits
#define blocksize 0xFF  // could be generated from blocksize - 1

これらすべてを生成したいのblockbitsですが、私が知っているプリプロセッサで使用できる電源操作はありません。

コンパイル時にこの種のものを生成する簡単な方法を知っている人はいますか?

4

2 に答える 2

9

それらを数式として定義できます。

#define blockbits 8
#define blocksize (1 << blockbits) 
#define blockXXXX (blocksize - 1) // changed from blocksize to blockXXXX, since blocksize is already taken

括弧は、他の式で使用するときに演算子の優先順位の問題がないことを確認するためのものです。

BLOCKBITSまた、名前を、、などのすべて大文字に変更することもできますBLOCKSIZE。これは、マクロを通常の名前と区別するためのC++の命名規則です。

于 2012-11-09T23:16:02.193 に答える
0

#define の代わりに const を使用したい場合、および実行時に値を計算する一般的な累乗関数 (2 のべき乗だけでなく) を作成したい場合は、次のようなテンプレートを使用して実行することもできます。

template<int num, int pow> struct temp_pow
{
    static const unsigned int result=temp_pow<num, pow-1>::result*num;
};

template<int num> struct temp_pow<num, 1>
{
    static const unsigned int result=num;
};

const int BLOCKBITS = 8;
const int BLOCKSIZE = temp_pow<2,BLOCKBITS>::result;   // could be generated from 2^BLOCKBITS
const int BLOCKSIZE_1 = BLOCKSIZE-1;
于 2012-11-10T01:03:59.543 に答える