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);
以上。
| 固定リンク | コメント (0) | トラックバック (0)
「プログラマー」カテゴリの記事
- 技術交流の業(2019.03.07)
- 福袋争奪戦デビュー(2019.01.31)
- 温泉旅行(2019.01.24)
- ゲーセンの近況(2018.11.29)
- 健康的にプログラミングを続けるためのちょっとした習慣(2018.10.18)
この記事へのコメントは終了しました。
コメント