最近,上位(下位) N ビットマスクが必要となる事が多く,その都度考えるのが面倒になってきたのでビットマスク用のテンプレートを作成します.作成すると言うほどのものでもありませんが.
template < int LowerBits, class Type = unsigned long > struct bitmask { static const Type full = ~(Type(0)); static const Type upper = ~((Type(1) << LowerBits) - 1); static const Type lower = (Type(1) << LowerBits) - 1; };
テンプレートパラメータに上位/下位の境界となる位置のビット数を下から数えた値(下位 N ビット)で指定します.その後は,上位のビットマスクが欲しければ bitmask
#include <iostream> #include <iomanip> #include "clx/utility.h" int main(int argc, char* argv[]) { std::cout << std::hex << std::showbase; std::cout << "2 bit mask:" << std::endl; std::cout << clx::bitmask<2>::upper << std::endl; std::cout << clx::bitmask<2>::lower << std::endl; std::cout << std::endl; std::cout << "10 bit mask:" << std::endl; std::cout << clx::bitmask<10>::upper << std::endl; std::cout << clx::bitmask<10>::lower << std::endl; std::cout << std::endl; std::cout << "15 bit mask:" << std::endl; std::cout << clx::bitmask<15>::upper << std::endl; std::cout << clx::bitmask<15>::lower << std::endl; std::cout << std::endl; std::cout << "16 bit mask:" << std::endl; std::cout << clx::bitmask<16>::upper << std::endl; std::cout << clx::bitmask<16>::lower << std::endl; std::cout << std::endl; std::cout << "31 bit mask:" << std::endl; std::cout << clx::bitmask<31>::upper << std::endl; std::cout << clx::bitmask<31>::lower << std::endl; return 0; }
実行結果
$ ./a 2 bit mask: 0xfffffffc 0x3 10 bit mask: 0xfffffc00 0x3ff 15 bit mask: 0xffff8000 0x7fff 16 bit mask: 0xffff0000 0xffff 31 bit mask: 0x80000000 0x7fffffff