« 紅葉狩り | トップページ | 平面変換 »

2014年12月 1日 (月)取りうる値の最大値が表現可能なビット数をコンパイル時に求める方法は?

おはようございます。本日の当番、プログラマのM.Oです。

プログラマ各位。

ビット演算について、ビットマスクと必要なビット数(シフト値)で
混乱をきたす事があります。
特に、256(8bit)を越えたあたりから怪しくなります。

例えばこんな感じ

unsigned int a = 4095;
unsigned int b = 2017;
unsigned int c = (a & 0xFFF) | ((b & 0xFFF) << 12);
unsigned int a2 = c & 0xFFF;
unsigned int b2 = (c >> 12) & 0xFFF;

この時に最大取れる値が4095だから、マスク値が0xFFFで
ビット数(シフト値)が12でっていうのがパッと出てこないわけです。

取りうる値の最大値から、必要なビット数(シフト値)のコンパイル時の算出は
解決してませんが、マスク値はビット数から計算で求められます。

#define MASK_VALUE(n) ((1<<(n))-1)
#define SHIFT_VALUE(n) (n) //
シフトも同じように書いときたい

unsigned int a = 4095;
unsigned int b = 2017;
unsigned int c = (a & MASK_VALUE(12)) |
((b & MASK_VALUE(12)) << SHIFT_VALUE(12));
unsigned int a2 = c & MASK_VALUE(12);
unsigned int b2 = (c >> SHIFT_VALUE(12)) & MASK_VALUE(12);

さっきより見やすい??
マスクやらシフトやらも一緒にやればいいかも。
ただ、ビット数をソラで出すのが辛い。

で、以下のような記述が可能となる、コンパイル時に取りうる値の最大値が
表現可能なビット数(シフト値)を求める良いやり方がありましたら教えて下さい。

const int iBitNum = BIT_NUM(4095); // 12を返す

unsigned int a = 4095;
unsigned int b = 2017;
unsigned int c = (a & MASK_VALUE(iBitNum)) |
((b & MASK_VALUE(iBitNum)) << SHIFT_VALUE(iBitNum));
unsigned int a2 = c & MASK_VALUE(iBitNum);
unsigned int b2 = (c >> SHIFT_VALUE(iBitNum)) & MASK_VALUE(iBitNum);

以上。

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2014/12/post-d1d4.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« 紅葉狩り | トップページ | 平面変換 »

プログラマー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/217647/60727552

この記事へのトラックバック一覧です: 取りうる値の最大値が表現可能なビット数をコンパイル時に求める方法は?:

« 紅葉狩り | トップページ | 平面変換 »